首先感谢
感谢江科大up的视频讲解。
STM32操控舵机
舵机的运行原理
舵机一共只有3个接口,电源和GND就占了两个,用于传输的就只有一个口,所以舵机的操作还是挺简单的。通过给舵机发送方波信号来实现舵机的转动,而通过设置方波信号的占空比来实现舵机的旋转角度,占空比与舵机旋转角度的关系如下。
输入信号脉冲宽度就是输入信号的占空比。周期为20ms是舵机的运行要求,这时已经定死了的。
怎么将方波传输给舵机?
这里还是用定时器,利用OC(输出比较),设置好CCR,然后设置对应定时器的对应比较通道,这个看引脚图,因为这是已经定死了的。
PWM周期就是从0计数到自动重装寄存器ARR的过程,占空比的关键就是高电平的持续时间,但这里是通过计数来类比的所以高电平时间就类比为CCR的值。这里设ARR为20k,则存在以下关系。
可以实现同一个定时器下所有比较通道均打开,如下图就是比较通道1和2都打开了
只需要修改1和2就行了,后面的结构体变量都是一样的,最多可以4个一起上。
代码
main.c部分
#include "stm32f10x.h" // Device header
#include "pwm.h"
#include "sevor.h"
#include "key.h"
uint8_t KeyNum;
float Angle;
int main(void)
{
OLED_Init();
PWM_Init();
Key_Init();
OLED_ShowString(1,1,"Angle=");
while (1)
{
KeyNum=Key_GetNum();
if(KeyNum==1)
Angle+=30;
if(Angle>180)
{
Angle=0;
}
Servo_SetAngle(Angle);
OLED_ShowNum(1,7,Angle,5);
}
}
舵机封装函数部分
sevor.c
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Servo_Init(void)
{
PWM_Init();
}
void Servo_SetAngle(float Angle)
{
PWM_SetCompare2(Angle / 180 *2000+500);
}
servo.h
#ifndef SEVOR_H
#define SEVOR_H
void Servo_Init(void);
void Servo_SetAngle(float Angle);
#endif