完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言:
我们的智能车一共有三个轮子,两个轮子是通过电机控制的,还有一个轮子只起到固定作用。让电机转动起来很容易,给它通上电就行,难的是控制电机转动的速度和电机转动的圈数。 转弯的实现: 当两个电机转动速度相同时,小车就会直行;当左电机比右电机转动快时,小车就右转;当右电机比左电机转动快时,小车就左转。这个现象你可以想象一下,不难理解。 图中用红线圈起来的就是起固定作用的万向轮,手里抓着的就是直流电机。 一、让电机转起来 我们这里使用的是直流电机,常见的还有步进电机,两种电机的原理不同,驱动方式也不同。 直流电机两端接上电源就能转动,但电压要在电机承受范围内,不然容易烧坏电机。 直流电机就两根线,这里简称为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定时器的一个设置,注释也标得很详细,结合定时器的知识进行理解即可。 这个模块的实验代码,我只写了一个电机的,另一个电机大家可以在理解的基础上自己补上。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1561 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1501 浏览 1 评论
933 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
665 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1555 浏览 2 评论
1850浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
615浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
506浏览 3评论
510浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
491浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 22:15 , Processed in 0.507326 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号