0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

第三篇-V1.5 TB6612电机pwm控制STM32智能小车 STM32F103C8T6单片机

STM32智能小车V1.5 来源:dfhjgfg 作者:dfhjgfg 2024-08-12 18:29 次阅读

功能介绍放开头, 使用便捷无需愁。

这是全网最详细、性价比最高的STM32实战项目入门教程,通过合理的硬件设计和详细的视频笔记介绍,硬件使用STM32F103主控资料多方便学习,通过3万字笔记、12多个小时视频、20多章节代码手把手教会你如何开发和调试。让你更快掌握嵌入式系统开发。

V1.5.0-STM32智能小车

V1.5.0:库函数开发。功能:循迹、避障、跟随、遥控、电池电压显示等。

视频合集链接推荐观看

[https://www.bilibili.com/video/BV1SY411L7rJ/?spm_id_from=333.337.search-card.all.click]

**V3.3.0-STM32智能小车 **

V3:HAL库开发、功能:PID速度控制、PID循迹、PID跟随、遥控、避障、PID角度控制、视觉控制、电磁循迹、RTOS等功能。

视频合集链接推荐观看

[https://www.bilibili.com/video/BV16x4y1M7EN/?spm_id_from=333.337.search-card.all.click]

系统软件设计

点亮小灯

查看原理图

查阅原理图,小灯接在PC13上下面驱动PC13
在这里插入图片描述

编写驱动

在这里插入图片描述

思考题:如果同时驱动PC13与PC14,应该如何编写?(答案:应该增加下图代码)
在这里插入图片描述
LED_Init()函数的代码

void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PC13
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化
GPIOC.13
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC.13输出高
}

LED.h 部分宏定义

#define LED PCout(13)// PC13

测试

编译下载(如果没有运行,需要按复位 运行)

电机驱动

由TB6612介绍得,通过控制AO和AO2高低电平可以控制AIN1和AIN2输出。

GPIO 高低电平控制AIN和BIN

  1. 查阅原理图AIN1、AIN2、BIN1、BIN2依次接在单片机的PB13、PB12、PB1、PB0
    在这里插入图片描述
  2. 原理同GPIO输出高低电平见第二节
    TB6612 GPIO驱动函数代码
//驱动6612 的AIN1 AIN2 BIN1 BIN2
// AIN1 PB13
// AIN2 PB12
// BIN1 PB1
// BIN2 PB0
void TB6612_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_13
|GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1; //PB0 OB1 PB12 PB13端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化
GPIO_SetBits(GPIOB,GPIO_Pin_13 |GPIO_Pin_12|GPIO_Pin_0|GPIO_Pin_1);
//PB0 OB1 PB12 PB1 输出高
}

相关宏定义

#define AIN1 PBout(13)// PB13
#define AIN2 PBout(12)// PB12
#define BIN1 PBout(1)// PB1
#define BIN2 PBout(0)// PB0

PWM控制PWMA和PWMB

将 PWM输出实验 的 timer 文件移植到我们前面点灯的工程中,更改驱动文件

  1. 查看原理图 PWMA 和PWMB依次连接PA11和PA8
  2. 查看 参考手册 关于定时器复用功能重映射的介绍(中文参考手册第119页)
    在这里插入图片描述
  3. 初始化外设
    配置对应引脚功能
    初始化TIM1
    初始化TIM1 相应通道的 PWM模式
    使能
    注意输出使能 高级定时器必须使用:TIM_CtrlPWMOutputs(TIM_TypeDef TIMx, *
    FunctionalState NewState);
//TIM1 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//使能对应定时器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能定时器1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,
ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1, ENABLE); //Timer3部分重映射
TIM3_CH2- >PB5
//配置对应引脚功能
//设置该引脚为复用输出功能,输出TIM1 CH1 和CH4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_11; //TIM_CH1 TIM_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重
装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预
分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数
模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据
TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM1 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽
度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使
能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输
出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3
OC2
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装
载寄存器
//初始化TIM1 Channel4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽
度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使
能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输
出比较极性高
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3
OC2
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装
载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能,高级定时器必须开启这
个
}

调用初始化函数、改变占空比。

TIM1_PWM_Init(1999,359);
//TIM1挂在APB2为72M ,故计算 72 000 000 /(359+1)/(1999+1) = 100 Hz,
//故设置了频率为100 Hz、自动重装载值 1999
TIM_SetCompare1(TIM1,100); //设置 TIM1 通道1 捕获/比较寄存器值 为 1000 可以
计算出占空比
//PA8 PWMB
TIM_SetCompare4(TIM1,1900); //设置
//PA11 PWMA

通过软件仿真

逻辑分析仪观察波形输出、显示PWM波形
设置好仿真环境
在这里插入图片描述
打开逻辑分析仪

在这里插入图片描述
添加要观察的引脚
在这里插入图片描述
跳到设置对应程序位置,打开仿真
在这里插入图片描述
打开实时更新选项
在这里插入图片描述
调节观察分析仪
在这里插入图片描述
产生的如图方波就是一种PWM波
在这里插入图片描述
在这里插入图片描述
那么在程序哪里设置的这些参数那
时钟预分频数 决定了PWM 频率和周期

TIM1_PWM_Init(1999,359);
//TIM1挂在APB2为72M ,故计算 72 000 000 /(359+1)/(1999+1) = 100 Hz,

那么谁调节占空比那?
在这里插入图片描述

  1. 非常好理解、定时器的计数器向上计数就是越来越大。
  2. PWM 模式我们可以看手册
    在这里插入图片描述
    3.这里的TIM_OCPolarity_High 就是把有效电平设置为高
    举个栗子:如果我们设置上面的示例参数,工作过程应该是怎么的呐?
    在这里插入图片描述
    电机控制通过AIN1、AIN2、BIN1、BIN2控制电机正反转,通过PWMA、PWMB控制电机转速
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //设置 A
TIM_SetCompare1(TIM1,1500); //设置B

让小车跑一跑吧

小车电机线正确接法
在这里插入图片描述
错误接法
在这里插入图片描述
小车直行

void Forward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //设置 A
TIM_SetCompare1(TIM1,1500); //设置B
}

小车后退

void Backward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //设置 A
TIM_SetCompare1(TIM1,1500); //设置B
}

小车左转

void Leftward(void)
{
AIN1 = 0;
AIN2 = 1;
BIN1 = 1;
BIN2 = 0;
TIM_SetCompare4(TIM1,1500); //设置 A
TIM_SetCompare1(TIM1,1500); //设置B
}

小车右转

void Rightward(void)
{
AIN1 = 1;
AIN2 = 0;
BIN1 = 0;
BIN2 = 1;
TIM_SetCompare4(TIM1,1500); //设置 A
TIM_SetCompare1(TIM1,1500); //设置B
}

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电机
    +关注

    关注

    141

    文章

    8746

    浏览量

    143698
  • PWM控制
    +关注

    关注

    7

    文章

    189

    浏览量

    26172
  • 智能小车
    +关注

    关注

    86

    文章

    548

    浏览量

    81460
  • STM32F103C8T6
    +关注

    关注

    105

    文章

    160

    浏览量

    82411
  • TB6612
    +关注

    关注

    1

    文章

    16

    浏览量

    2276
收藏 人收藏

    评论

    相关推荐

    基于STM32F103C8T6TB6612FNG的平衡小车是如何制作的

    平衡小车的硬件是由哪些部分组成的?基于STM32F103C8T6TB6612FNG的平衡小车是如何制作的?
    发表于 11-04 06:46

    基于STM32的双轮平衡小车设计

    预告:代码及文档下载方案分析1、基于STM32F103C8T6 单片机的双轮自平衡小车系统;2、以 MPU6050 轴陀螺仪加速计为传感器的姿态感知系统;3、通过卡尔曼滤波对传感器的
    发表于 11-30 08:03

    TB6612驱动相关资料推荐

    TB6612驱动(双驱动)PWMA,AIN1, AIN2, BIN1, BIN2和PWMB为驱动电路的输入引脚连接stm32f103c8t6,左侧的AO1, AO2, BO1和BO2为连接电机的输出
    发表于 01-17 06:08

    采用STM32F103C8T6单片机制作两轮平衡小车控制系统的资料分享

    主控MCU采用STM32F103C8T6单片机电机驱动模块采用TB6612FNG模块,姿态监测传感器采用MPU6050芯片,蓝牙模块采用HC-05蓝牙模块。
    发表于 01-19 06:43

    stm32f103c8t6封装及最小系统原理图

    系统原理图。 STM32F103C8T6封装 STM32F103C8T6封装为LQFP48-48引脚小外形四方扁平封装外形,如下图: STM32F103C8T6最小系统原理图 单片机
    发表于 11-23 15:50 34.8w次阅读

    STM32F103C8T6单片机模型的资料和程序免费下载

    本文档的主要内容详细介绍的是STM32F103C8T6单片机模型的资料和程序免费下载。
    发表于 09-27 17:00 227次下载

    STM32F103C8T6单片机的电路原理图免费下载

    本文档的主要内容详细介绍的是STM32F103C8T6单片机的电路原理图免费下载。
    发表于 04-22 08:00 80次下载
    <b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>单片机</b>的电路原理图免费下载

    STM32F103C8T6核心板的资料合集免费下载

    本文档的主要内容详细介绍的是STM32F103C8T6核心板的资料合集免费下载包括了:STM32F103C8T6核心板测试程序(PC13闪烁),STM32F103C8T6核心板测试程序(RTC
    发表于 06-04 08:00 520次下载
    <b class='flag-5'>STM32F103C8T6</b>核心板的资料合集免费下载

    STM32F103C8T6单片机原理图下载

    STM32F103C8T6单片机原理图下载
    发表于 04-12 09:36 0次下载
    <b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>单片机</b>原理图下载

    stm32f103c8t6单片机驱动台达伺服电机

    、简介本文使用的是伺服电机的位置模式,以stm32f103c8t6单片机输出脉冲,作为伺服电机驱动器的位置脉冲输入,从而达到伺服电机位置
    发表于 11-18 21:06 77次下载
    <b class='flag-5'>stm32f103c8t6</b><b class='flag-5'>单片机</b>驱动台达伺服<b class='flag-5'>电机</b>

    使用STM32F103C8T6控制L298N电机驱动麦克纳姆轮小车(HAL库)

    使用STM32F103C8T6控制L298N电机驱动麦克纳姆轮小车(HAL库)
    发表于 11-23 17:36 55次下载
    使用<b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>控制</b>L298N<b class='flag-5'>电机</b>驱动麦克纳姆轮<b class='flag-5'>小车</b>(HAL库)

    STM32F103C8t6程序下载

    STM32F103C8t6程序下载
    发表于 11-24 18:21 229次下载
    <b class='flag-5'>STM32F103C8t6</b>程序下载

    STM32F103C8T6单片机 Flash有128K

    一 序:1 STM32F103C8T6STM32F103CBT6 引脚相同,唯一的区别是前者为64kflash(0x8000000~0x800FFFF) 后者为128kflash
    发表于 12-02 10:36 26次下载
    <b class='flag-5'>STM32F103C8T6</b><b class='flag-5'>单片机</b> Flash有128K

    STM32平衡小车 TB6612电机驱动学习

    TB6612FNG简介 单片机引脚的电流一般只有几十个毫安,无法驱动电机,因此一般是通过单片机控制 电机
    发表于 05-16 15:18 2次下载
    <b class='flag-5'>STM32</b>平衡<b class='flag-5'>小车</b> <b class='flag-5'>TB6612</b><b class='flag-5'>电机</b>驱动学习

    使用stm32f103c8t6设计的蓝牙小车

    使用stm32f103c8t6设计的蓝牙小车,具有前进后退,左转右转等功能
    发表于 08-07 16:08 25次下载