文章目录
- 前言
- 一、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 range
angle = 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