文章目录
- 前言
- 一、cubemx配置
- 二、代码
- 1.serve.c
- 2.serve.h
- 3.主函数
- 总结
前言
stm32对舵机进行控制,很简单直接一个pwm就可以实现
pwm的周期是50HZ占空比分别对应
一个0.5ms的高电平对应于0度
一个1.5ms的高电平对应于90度
一个2.5ms的高电平对应于180度
因此,您可以通过改变PWM信号的占空比来改变舵机的角度。占空比是PWM信号的高电平时间与PWM信号的总周期之比。在这里,PWM信号的总周期通常是20ms(对应于50Hz的频率),所以:
对于0度,占空比是0.5ms/20ms = 2.5%
对于90度,占空比是1.5ms/20ms = 7.5%
对于180度,占空比是2.5ms/20ms = 12.5%
一、cubemx配置
以我的c8t6为例
时钟频率是72MHZ
为了得到50HZ就设定为720-1 和 2000-1
其中2000-1的arr值后面还要用到。
二、代码
1.serve.c
#include "serve.h"Servo ser_1;void servo_init(Servo* servo, TIM_HandleTypeDef* htim, uint32_t channel, uint16_t arr)
{servo->htim = htim;servo->channel = channel;servo->arr = arr;HAL_TIM_PWM_Start(htim,channel); }void set_servo_angle(Servo* servo, uint8_t angle)
{if (angle > 180) {// Angle out of rangeangle = 180;}if(angle<0){angle = 0;}servo->angle = angle;uint16_t pulse_length = (uint16_t)(servo->arr * 1.0 / 20 * (1.0 + angle / 180.0));__HAL_TIM_SET_COMPARE(servo->htim, servo->channel, pulse_length);
}
2.serve.h
typedef struct {TIM_HandleTypeDef* htim;uint32_t channel;uint16_t arr;uint8_t angle;
} Servo;extern Servo ser_1;void servo_init(Servo* servo, TIM_HandleTypeDef* htim, uint32_t channel, uint16_t arr) ;
void set_servo_angle(Servo* servo,uint8_t angle) ;
3.主函数
servo_init(&ser_1,&htim1,TIM_CHANNEL_1,2000);set_servo_angle(&ser_1,180);
总结
over