STM32
登录
直播中
张英
7年用户
1407经验值
私信
关注
[问答]
如何去实现一种基于stm32的智能小车设计
开启该帖子的消息推送
STM32
智能小车
PWM
如何去实现一种基于
STM32
的智能小车设计?
回帖
(1)
张荣
2021-9-29 16:31:56
前言:
我们的智能车一共有三个轮子,两个轮子是通过电机控制的,还有一个轮子只起到固定作用。让电机转动起来很容易,给它通上电就行,难的是控制电机转动的速度和电机转动的圈数。
转弯的实现:
当两个电机转动速度相同时,小车就会直行;当左电机比右电机转动快时,小车就右转;当右电机比左电机转动快时,小车就左转。这个现象你可以想象一下,不难理解。
图中用红线圈起来的就是起固定作用的万向轮,手里抓着的就是直流电机。
一、让电机转起来
我们这里使用的是直流电机,常见的还有步进电机,两种电机的原理不同,驱动方式也不同。
直流电机两端接上电源就能转动,但电压要在电机承受范围内,不然容易烧坏电机。
直流电机就两根线,这里简称为A线、B线。
当你把A线接正极,B线接负极,电机就会转,当你把A线接负极,B线接正极,电机就会往相反的方向转,这就对应着小车的前进和后退行为。
我们一般不将电机直接连在GPIO引脚上,而是通过一个电机控制芯片来将stm32和电机连接起来。
常用的电机驱动芯片有很多,这里简单介绍一下TB6612。
这一个芯片可以控制A、B两个电机,AIN1 AIN2就是电机A作为输入的两根信号线,我们接到stm32的GPIO引脚上,AO1 AO2就是电机A作为输出的两个信号引脚,我们接到直流电机上,VCC、GND就不说了,重点关注一下PWMA和PWMB,这是电机驱动的重点所在——速度控制。
我们先小结一下:
1、电机就是用电器,通电它就转
2、为了安全,我们一般不直接将stm32和电机连接,而是在它们之间添加了一个电机控制芯片
3、控制直流电机“前进”或“后退”,只要调换正负极改变电流方向即可
二、让电机速度受控
让电机速度受控,说白了,电机的功率大它就转的快,功率小它就转的慢;再说得更白一点,直流电源电压越高电机就转的越快,电压越小电机就转的越慢。
通过PWM控制电机转速,你可以理解为就是改变了电压这个变量。
PWM是什么?
PWM(Pulse Width Modulation)脉冲宽度调制,为了直观地表达清楚,画张图:
上图中,两根红色虚线之间就是一个周期T,第一根蓝线,在每个周期内状态稳定不变化;但第二根蓝线,在每个周期内高低电平所占时间各位一半。
“脉冲宽度调制”就是说,我们可以随意调整每个周期内高低电平所占时间的比例,这里的“宽度”其实就是持续时间。
你可能还是不理解,通过改变每个周期内高低电平所占时间的比例就能让电机变速吗?就以上面这张高低电平都占50%的图为例,你可以理解成在这种方式下输出的平均电压其实是(0+3.3)/2,电压变了,功率也就变了,电机转速也就变了,这里和高数里的极限思想有些许异曲同工之妙。
与PWM相关的还有一个名词叫“占空比”,占空比指的是“有效电平”在一个周期内所占时间的比例,这个“有效电平”可以是高电平,也可以是低电平,这一点要注意。
当我们把有效电平定义为高电平时,当占空比从0%慢慢变化到100%,那么电机的速度就会是逐渐增大的;反之,电机转速逐渐减小。
PWM的调制实现其实是定时器应用的一种体现方式,这里不再细致展开了,如果你对PWM的原理还有疑惑,麻烦移步传帮带公众号——“游侠嵌入式”,此处就不展开了。
三、动手实践
这里仅贴出部分重要代码
Mvoid Motor_Init(void)
{
//设置PWM的定时器输出引脚模式
RCC-》APB2ENR |= 1《《2;
RCC-》APB2ENR |= 1《《5;
GPIOA-》CRH &= 0XFFFFFFF0;
GPIOA-》CRH |= 0X00000003;
GPIOA-》ODR |= 1《《8;
//设置控制直流电机顺时针、逆时针转动的引脚模式
RCC-》APB2ENR|=1《《3;
GPIOB-》CRL&=0XFFFFF00F;
GPIOB-》CRL|=0X00000330;
GPIOB-》ODR|=2《《1;
}
Motor_Init函数是对电机的初始化,包括PWM的输出引脚模式、控制直流电机顺时针、逆时针转动,说白了就是GPIO设置为输出。
void TIM1_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC-》APB2ENR|=1《《11; //TIM1时钟使能
GPIOA-》CRH&=0XFFFFFFF0; //PA8清除之前的设置
GPIOA-》CRH|=0X0000000B; //复用功能输出
TIM1-》ARR=arr; //设定计数器自动重装值
TIM1-》PSC=psc; //预分频器设置
TIM1-》CCMR1|=7《《4; //CH1 PWM2模式
TIM1-》CCMR1|=1《《3; //CH1预装载使能
TIM1-》CCER|=1《《0; //OC1 输出使能
TIM1-》BDTR|=1《《15; //MOE 主输出使能
TIM1-》CR1=0x0080; //ARPE使能
TIM1-》CR1|=0x01; //使能定时器1
}
这部分代码是对PWM定时器的一个设置,注释也标得很详细,结合定时器的知识进行理解即可。
这个模块的实验代码,我只写了一个电机的,另一个电机大家可以在理解的基础上自己补上。
前言:
我们的智能车一共有三个轮子,两个轮子是通过电机控制的,还有一个轮子只起到固定作用。让电机转动起来很容易,给它通上电就行,难的是控制电机转动的速度和电机转动的圈数。
转弯的实现:
当两个电机转动速度相同时,小车就会直行;当左电机比右电机转动快时,小车就右转;当右电机比左电机转动快时,小车就左转。这个现象你可以想象一下,不难理解。
图中用红线圈起来的就是起固定作用的万向轮,手里抓着的就是直流电机。
一、让电机转起来
我们这里使用的是直流电机,常见的还有步进电机,两种电机的原理不同,驱动方式也不同。
直流电机两端接上电源就能转动,但电压要在电机承受范围内,不然容易烧坏电机。
直流电机就两根线,这里简称为A线、B线。
当你把A线接正极,B线接负极,电机就会转,当你把A线接负极,B线接正极,电机就会往相反的方向转,这就对应着小车的前进和后退行为。
我们一般不将电机直接连在GPIO引脚上,而是通过一个电机控制芯片来将stm32和电机连接起来。
常用的电机驱动芯片有很多,这里简单介绍一下TB6612。
这一个芯片可以控制A、B两个电机,AIN1 AIN2就是电机A作为输入的两根信号线,我们接到stm32的GPIO引脚上,AO1 AO2就是电机A作为输出的两个信号引脚,我们接到直流电机上,VCC、GND就不说了,重点关注一下PWMA和PWMB,这是电机驱动的重点所在——速度控制。
我们先小结一下:
1、电机就是用电器,通电它就转
2、为了安全,我们一般不直接将stm32和电机连接,而是在它们之间添加了一个电机控制芯片
3、控制直流电机“前进”或“后退”,只要调换正负极改变电流方向即可
二、让电机速度受控
让电机速度受控,说白了,电机的功率大它就转的快,功率小它就转的慢;再说得更白一点,直流电源电压越高电机就转的越快,电压越小电机就转的越慢。
通过PWM控制电机转速,你可以理解为就是改变了电压这个变量。
PWM是什么?
PWM(Pulse Width Modulation)脉冲宽度调制,为了直观地表达清楚,画张图:
上图中,两根红色虚线之间就是一个周期T,第一根蓝线,在每个周期内状态稳定不变化;但第二根蓝线,在每个周期内高低电平所占时间各位一半。
“脉冲宽度调制”就是说,我们可以随意调整每个周期内高低电平所占时间的比例,这里的“宽度”其实就是持续时间。
你可能还是不理解,通过改变每个周期内高低电平所占时间的比例就能让电机变速吗?就以上面这张高低电平都占50%的图为例,你可以理解成在这种方式下输出的平均电压其实是(0+3.3)/2,电压变了,功率也就变了,电机转速也就变了,这里和高数里的极限思想有些许异曲同工之妙。
与PWM相关的还有一个名词叫“占空比”,占空比指的是“有效电平”在一个周期内所占时间的比例,这个“有效电平”可以是高电平,也可以是低电平,这一点要注意。
当我们把有效电平定义为高电平时,当占空比从0%慢慢变化到100%,那么电机的速度就会是逐渐增大的;反之,电机转速逐渐减小。
PWM的调制实现其实是定时器应用的一种体现方式,这里不再细致展开了,如果你对PWM的原理还有疑惑,麻烦移步传帮带公众号——“游侠嵌入式”,此处就不展开了。
三、动手实践
这里仅贴出部分重要代码
Mvoid Motor_Init(void)
{
//设置PWM的定时器输出引脚模式
RCC-》APB2ENR |= 1《《2;
RCC-》APB2ENR |= 1《《5;
GPIOA-》CRH &= 0XFFFFFFF0;
GPIOA-》CRH |= 0X00000003;
GPIOA-》ODR |= 1《《8;
//设置控制直流电机顺时针、逆时针转动的引脚模式
RCC-》APB2ENR|=1《《3;
GPIOB-》CRL&=0XFFFFF00F;
GPIOB-》CRL|=0X00000330;
GPIOB-》ODR|=2《《1;
}
Motor_Init函数是对电机的初始化,包括PWM的输出引脚模式、控制直流电机顺时针、逆时针转动,说白了就是GPIO设置为输出。
void TIM1_PWM_Init(u16 arr,u16 psc)
{
//此部分需手动修改IO口设置
RCC-》APB2ENR|=1《《11; //TIM1时钟使能
GPIOA-》CRH&=0XFFFFFFF0; //PA8清除之前的设置
GPIOA-》CRH|=0X0000000B; //复用功能输出
TIM1-》ARR=arr; //设定计数器自动重装值
TIM1-》PSC=psc; //预分频器设置
TIM1-》CCMR1|=7《《4; //CH1 PWM2模式
TIM1-》CCMR1|=1《《3; //CH1预装载使能
TIM1-》CCER|=1《《0; //OC1 输出使能
TIM1-》BDTR|=1《《15; //MOE 主输出使能
TIM1-》CR1=0x0080; //ARPE使能
TIM1-》CR1|=0x01; //使能定时器1
}
这部分代码是对PWM定时器的一个设置,注释也标得很详细,结合定时器的知识进行理解即可。
这个模块的实验代码,我只写了一个电机的,另一个电机大家可以在理解的基础上自己补上。
举报
更多回帖
rotate(-90deg);
回复
相关问答
STM32
智能小车
PWM
怎样
去
设计
一种
基于
STM32
的
智能
小车
2021-10-11
1316
怎样
去
设计
一种
基于
STM32
F103芯片的
智能
小车
呢
2021-11-18
1519
怎样
去
开发
一种
基于树莓派与
STM32
系统板的
智能
小车
2021-10-09
1375
请问
一
下怎样
去
设计
一种
基于
stm32
的蓝牙
智能
小车
?
2021-07-26
1127
如何
去
实现
一种
基于ESP8266的物联网
智能
小车
呢
2022-02-22
1111
如何
去
实现
一种
WiFi
智能
小车
的制作呢
2022-01-24
965
如何
去
实现
一种
基于
STM32
的
智能
家居系统设计
2021-10-21
1943
怎样
去
设计
一种
基于
STM32
的
智能
循迹
小车
2021-10-19
904
如何
去
实现
一种
基于
STM32
f103的简单自平衡
小车
设计呢
2021-12-14
1537
如何
去
实现
一种
基于
STM32
的蓝牙
小车
设计
2021-09-26
1900
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分