stm32c8t6-PWM控制SG90舵机及用串口下载程序

舵机是用PWM波控制的,学完PWM就可以简单的控制舵机啦。
我用的是stm32c8t6单片机,高级定时器TIM1_CH1,使用通用定时器也行,大同小异,结果都一样。定时器部分的知识,代码网上都有,我这里不再赘述。
开始之前我们先了解一下舵机的特点:①舵机的确是有顺时针,逆时针转动,但是舵机不需要知道原来的角度位置,只要有新的PWM信号,该信号的角度是多少,它就会转到多少度(百度网友的回答)。
②舵机需要MCU产生一个20ms(即50Hz)的脉冲信号。在这个信号中,0.5ms对应0度,1.0ms对应45度,1.5ms对应90度,2.0ms对应135度,2.5ms对应180度。
程序配置:
PERIOD - 199
PSC - 7199
PULSE - 200
main.c程序如下:

   while( 1 )
  {    //顺时针:先从0度转到45度位置,然后回到0度位置,再转到90度的位置,
      //逆时针:在90度位置逆时针转45度,再回到90度的位置,再逆时针转90度,回到起点。
      TIM_SetCompare1(TIM1, 195);       //0度位置
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 190);      //45度位置
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 195);       //0度位置
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 185);      //90度位置
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 190);
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 185);
      SysTick_Delay_ms(3000);
      TIM_SetCompare1(TIM1, 195);  
   }

调用 TIM_SetCompare1(TIM1, 195)这个函数就可以输出相应的PWM波了。
有一个小插曲:我的单片机用Stlink下载不进去,经同学的帮助,原来串口也可以下载。串口上分别有5V,VCC,3V3,TXD,RXD,GND.其中,TXD连接单片机的USART1的RXD引脚,即PA9,RXD连接TXD引脚,即PA10。另外下载时要把Boot0拉高,而Boot1拉低。当执行程序时,要把Boot0拉低,Boot1依然是低电位。执行程序时有时还要按一下复位键才会执行程序。

欢迎交流学习!

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
你可以使用STM32c8t6PWM输出来驱动4个SG90舵机SG90舵机控制信号是一个PWM信号,其占空比在0.5ms到2.5ms之间,对应着舵机转动的角度范围为0度到180度。你可以将STM32c8t6的四个PWM通道分别接到四个SG90舵机控制信号引脚上,然后通过编写程序控制PWM输出的占空比来控制四个舵机的转动角度。 以下是一个简单的示例代码,可以实现控制一个PWM通道输出PWM信号来驱动一个SG90舵机转动到指定的角度: ```c #include "stm32f1xx_hal.h" #define PWM_PERIOD 20000 // PWM周期为20ms #define PWM_MIN_PULSE_WIDTH 1000 // PWM最小占空比对应的脉宽为1ms #define PWM_MAX_PULSE_WIDTH 2000 // PWM最大占空比对应的脉宽为2ms TIM_HandleTypeDef htim; void PWM_Init(void) { TIM_MasterConfigTypeDef sMasterConfig = {0}; TIM_OC_InitTypeDef sConfigOC = {0}; htim.Instance = TIM3; htim.Init.Prescaler = 72-1; // 分频器为72,时钟频率为72MHz/72=1MHz htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = PWM_PERIOD-1; // PWM周期为20ms,计数器最大值为20000-1 htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig) != HAL_OK) { Error_Handler(); } sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比为0 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; if (HAL_TIM_PWM_ConfigChannel(&htim, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_1); // 启动PWM输出 } void SG90_SetAngle(float angle) { uint32_t pulse_width = (uint32_t)(PWM_MIN_PULSE_WIDTH + (PWM_MAX_PULSE_WIDTH - PWM_MIN_PULSE_WIDTH) * angle / 180); __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_1, pulse_width); // 设置PWM占空比 } int main(void) { HAL_Init(); PWM_Init(); while (1) { SG90_SetAngle(0); // 转动到0度 HAL_Delay(1000); SG90_SetAngle(90); // 转动到90度 HAL_Delay(1000); SG90_SetAngle(180); // 转动到180度 HAL_Delay(1000); } } ``` 注意,这只是一个简单的示例代码,实际应用中可能需要根据具体的需求进行修改。同时,需要根据舵机的电源电压和工作电流来选择合适的驱动电路。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值