STM32
直播中

史晓明

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

如何通过STM32实现舵机180°旋转?

如何通过STM32实现舵机180°旋转?

回帖(1)

姚秋月

2021-11-18 11:42:33
单片机型号:STM32F103C8
  功能要求:

  要求通过STM32实现舵机180°旋转,超声波放置在舵机上,实现一边旋转一边测距,同时可以设置测距的最大距离。
  设计的STM32的技术有:串口中断,外部中断,定时器中断,PWM,滴答定时器
  超声波使用的型号如下:
  
  

  

  舵机的型号如下(其它型号同样适用):
  
  

  

  超声波测距是通过定时器加中断实现的,接线:
  VCC——+5V
  GND——GND
  Trig——PC7
  Echo——PC8 (同时映射为外部中断口8)
  代码实现依据:
  
  

  

   
  舵机的实现:因为舵机需要通过PWM才能驱动舵机正常转动,时序图如图
  舵机的主要组成部分为伺服电机,所谓伺服就是服从信号的要求而动作。在信号来之前,转子停止不动;信号来到之后,转子立即运动。因此我们就可以给舵机输入不同的信号,来控制其旋转到不同的角度。
舵机接收的是 PWM 信号,当信号进入内部电路产生一个偏置电压,触发电机通过减速齿轮带动电位器移动,使电压差为零时,电机停转,从而达到伺服的效果。简单来说就是给舵机一个特定的 PWM 信号,舵机就可以旋转到指定的位置。舵机上有三根线,分别是 GND、VCC 和 SIG,也就是地线、电源线和信号线,其中的 PWM 波就是从信号线输入给舵机的。一般来说,舵机接收的 PWM 信号频率为 50HZ,即周期为 20ms。当高电平的脉宽在 0.5ms-2.5ms 之间时舵机就可以对应旋转到不同的角度。
  
  

  

  代码中使用PA6口作为PWM输出引脚。
  同时配置了串口,并设计了测量范围控制,控制器测量的最远距离。
  由于代码设计文件比较多,无法一一粘贴。
  
  

  

  
模块名称
HC-SR04
STM32的IO口工作模式
GNDGND-
VCC+5V-
TrigPC7GPIO_Mode_Out_PP
(推挽输出)
EchoPC8GPIO_Mode_IN_FLOATING
(浮空输入)
-PB6USART1_TX(需要映射)
-PB7USART1_RX(需要映射)
模块名称
舵机
STM32的IO口工作模式
DATAPC6GPIO_Mode_AF_PP
(需要输出PWM)
GNDGND
VCC+5V




  代码片段:

/****************************************
        函数名称:void SteeringEngineAndUltrasonic(uint8_t fun)
        函数参数:
                        uint8_t fun:指定TFT显示屏的功能,0X01显示第一页,0X02显示第二页,10-1F选择第一页的第几行数据,20-2F选择第二页的第几行数据
        函数返回值:无
        函数功能:
                        舵机与超声波测距,舵机左右旋转180°,边旋转边测距
        创建作者:
        创建时间:2021.4.30
        联系方式:QQ:
        修改作者:
        修改时间:
        修改说明:
****************************************/
void SteeringEngineAndUltrasonic(uint8_t fun)
{
        s32 rang = 0;
        int i;
        for(i = 1950;i >= 1805;i--)
        {
                TIM_SetCompare1(TIM3, i);//  设置占空比
                rang = Ultrasonic_Ranging();
                //USART1_printf(USART1,"rnrang=%dn",rang);    //    发至串口助手显示
                sendDataToTFT(fun, rang);        //        可以输出到液晶屏显示
                delay_ms(20);       
        }
        for(;i <= 1950;i++)
        {
                TIM_SetCompare1(TIM3, i);//         设置占空比
                rang = Ultrasonic_Ranging();
                //USART1_printf(USART1,"rnrang=%dn",rang);   //    发至串口助手显示
                sendDataToTFT(fun, rang);        //        可以输出到液晶屏显示
                delay_ms(20);
        }
}
注意:我们这里使用了串口屏,如果需要发送至串口助手显示,需要放开USART1_printf(USART1,"rnrang=%dn",rang); 然后将sendDataToTFT(fun, rang);注释掉就可以。
   
  
  

  

   
  
   
   
举报

更多回帖

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