[其他ST产品] 用stm32控制舵机——以stm32F103C8T6为例

[复制链接]
6264|58
 楼主| yellow555 发表于 2023-7-26 17:28 | 显示全部楼层
此时将舵机上电,信号线连接到PA6,可以看到舵机旋转

9975164c0e7372fe45.png

 楼主| yellow555 发表于 2023-7-26 17:28 | 显示全部楼层
五、控制多个舵机
控制一个舵机成功后,进一步控制多个舵机,先以TIM3增加输出通道为例,这里增加Channel2,输出端口配置为PA7
首先配置bsp_servo.h与bsp_servo.c中的CH2
 楼主| yellow555 发表于 2023-7-26 17:28 | 显示全部楼层
  1. // TIM3 输出比较通道2
  2. #define            GENERAL_TIM_CH2_GPIO_CLK      RCC_APB2Periph_GPIOA
  3. #define            GENERAL_TIM_CH2_PORT          GPIOA
  4. #define            GENERAL_TIM_CH2_PIN           GPIO_Pin_7

  5. static void GENERAL_TIM_GPIO_Config(void)
  6. {
  7.   GPIO_InitTypeDef GPIO_InitStructure;

  8.   // 输出比较通道1 GPIO 初始化
  9.         RCC_APB2PeriphClockCmd(GENERAL_TIM_CH1_GPIO_CLK, ENABLE);
  10.   GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH1_PIN;
  11.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  12.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  13.   GPIO_Init(GENERAL_TIM_CH1_PORT, &GPIO_InitStructure);
  14.        
  15.          // 输出比较通道1 GPIO 初始化
  16.         RCC_APB2PeriphClockCmd(GENERAL_TIM_CH2_GPIO_CLK, ENABLE);
  17.   GPIO_InitStructure.GPIO_Pin =  GENERAL_TIM_CH2_PIN;
  18.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  19.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.   GPIO_Init(GENERAL_TIM_CH2_PORT, &GPIO_InitStructure);
  21. }

  22. static void GENERAL_TIM_Mode_Config(void)
  23. {
  24.   // 开启定时器时钟,即内部时钟CK_INT=72M
  25.         GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);

  26. /*--------------------时基结构体初始化-------------------------*/
  27.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  28.         // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
  29.         TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_Period;       
  30.         // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
  31.         TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_Prescaler;       
  32.         // 时钟分频因子 ,配置死区时间时需要用到
  33.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
  34.         // 计数器计数模式,设置为向上计数
  35.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
  36.         // 重复计数器的值,没用到不用管
  37.         TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
  38.         // 初始化定时器
  39.         TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
  40.        
  41.        
  42.         /*--------------------输出比较结构体初始化-------------------*/       
  43.        
  44.         TIM_OCInitTypeDef  TIM_OCInitStructure;
  45.         // 配置为PWM模式1
  46.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  47.         // 输出使能
  48.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  49.         // 输出通道电平极性配置       
  50.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  51.        
  52.         // 输出比较通道 1
  53.         TIM_OCInitStructure.TIM_Pulse = 0;
  54.         TIM_OC1Init(GENERAL_TIM, &TIM_OCInitStructure);
  55.         TIM_OC1PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  56.        
  57.         // 输出比较通道 2
  58.         TIM_OCInitStructure.TIM_Pulse = 0;
  59.         TIM_OC2Init(GENERAL_TIM, &TIM_OCInitStructure);
  60.         TIM_OC2PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
  61.        
  62.                 // 使能计数器
  63.         TIM_Cmd(GENERAL_TIM, ENABLE);
  64. }
 楼主| yellow555 发表于 2023-7-26 17:29 | 显示全部楼层
然后来到main.c,这里是使用TIM_SetCompare2(GENERAL_TIM ,Compare);对于函数
TIM_SetComparex(TIMy,Compare);设置的是TIMy模块CHx的脉宽。
  1. int main(void)
  2. {
  3.         GENERAL_TIM_Init();
  4.        
  5.         while(1)
  6.         {
  7.                 for(int i = 5;i<26;i++)
  8.                 {
  9.             TIM_SetCompare1(GENERAL_TIM ,i);
  10.                         SOFT_DELAY;
  11.                 }
  12.                 for(int i = 5;i<26;i++)
  13.                 {
  14.             TIM_SetCompare2(GENERAL_TIM ,i);
  15.                         SOFT_DELAY;
  16.                 }
  17.         }
  18. }
 楼主| yellow555 发表于 2023-7-26 17:29 | 显示全部楼层
可以看到两个舵机按照程序转动起来。

2843664c0e76db6422.png

之后要增加控制舵机的数据,可以先增加TIMx的通道数,一个通用或者高级定时器有四个输出通道,还可以增加新的TIM,达到控制多个舵机的目的。为了避免篇幅过于冗长,这里不挂出具体代码。
 楼主| yellow555 发表于 2023-7-26 17:29 | 显示全部楼层
最后再来一个挂载四个的
8234064c0e7843f842.png
wilhelmina2 发表于 2023-9-9 17:09 | 显示全部楼层
用stm32怎么控制18个舵机?
uptown 发表于 2023-9-9 18:31 | 显示全部楼层
如何控制舵机的角度              
albertaabbot 发表于 2023-9-9 18:44 | 显示全部楼层
舵机控制芯片有多种,如PCA9685、SPC560P70F5等,需要根据实际需求选择合适的舵机控制芯片。
primojones 发表于 2023-9-9 18:53 | 显示全部楼层
舵机通常需要较高的电流来工作,因此在连接舵机时,要确保给它提供足够的电源,并且要与STM32微控制器隔离
deliahouse887 发表于 2023-9-9 19:07 | 显示全部楼层
如果舵机需要更大的驱动电流,可以在PWM线上增加适当大小的电阻来提高舵机性能。
wangdezhi 发表于 2023-9-9 20:39 | 显示全部楼层
在控制舵机时,要注意避免超过舵机的最大扭矩和速度,以防止损坏舵机。
albertaabbot 发表于 2023-9-9 21:35 | 显示全部楼层
可以通过限制PWM占空比或使用软件算法来实现保护措施。
tifmill 发表于 2023-9-9 22:04 | 显示全部楼层
求stm32控制四自由度舵机的程序
Henryko 发表于 2023-9-11 21:50 | 显示全部楼层
感觉这个宏定义也不是很方便啊
zerorobert 发表于 2023-9-12 15:38 | 显示全部楼层
通过控制占空比,来控制舵机的转动角度,在实现控制算法时,主要是PID算法,将目标角度转化为PWM執行器的输出值。
loutin 发表于 2023-9-12 16:59 | 显示全部楼层
在程序中正确初始化STM32的PWM输出,并编写相应的控制算法来实现舵机的角度控制。可以使用定时器或软件延时来生成所需的PWM信号。
sanfuzi 发表于 2023-9-12 17:07 | 显示全部楼层
使用STM32控制舵机时,需要注意初始角度、电源和PWM信号等关键因素,以便实现精确的控制
updownq 发表于 2023-9-12 18:38 | 显示全部楼层
舵机的工作电压通常在3.3V到6V之间,因此需要确保STM32的输出电压能够满足舵机的要求。
sesefadou 发表于 2023-9-12 18:48 | 显示全部楼层
为了保护STM32的输出引脚和提供足够的电流给舵机,通常需要使用驱动电路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部