STM32
直播中

张英

7年用户 1389经验值
私信 关注
[问答]

如何去实现一种基于stm32的智能小车设计

如何去实现一种基于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定时器的一个设置,注释也标得很详细,结合定时器的知识进行理解即可。
  这个模块的实验代码,我只写了一个电机的,另一个电机大家可以在理解的基础上自己补上。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分