同学送的一个这个舵机,我想着把它驱动了,找了些资料和代码,刚好能驱动成功,细节没有看太多,有些不明白的地方,我在文中指出来。
硬件介绍:SG92R
红线:5v 棕线:GND 黄线:信号线(接其他引脚)
舵机的工作原理:
sg92r的控制电路由微控制器或其他控制器提供PWM(脉宽调制)信号。
我的理解,有这个区间 0.5ms~2.5ms,然后输出高电平就能驱动,我的操作是用for循环去遍历这个区间的值,到达驱动的目的。
#include "stm32f10x.h"
#define PWM_FREQ 50 // 设置PWM信号频率为50Hz
#define SERVO_MIN_PULSE_WIDTH 500 // 舵机最小脉宽500us
#define SERVO_MAX_PULSE_WIDTH 2500 // 舵机最大脉宽2500us
#define SERVO_LEFT_POSITION 1300 // 舵机左转位置的脉宽
void delay_us(uint32_t us) {
uint32_t count = us * (SystemCoreClock / 1000000) / 9;
while(count--);
}
void servo_rotate(uint16_t pulse_width) {
GPIO_SetBits(GPIOA, GPIO_Pin_6); // 设置PB5输出高电平
delay_us(pulse_width); // 延时等待脉宽结束
GPIO_ResetBits(GPIOA, GPIO_Pin_6); // 设置PB5输出低电平
delay_us(20000 - pulse_width); // 延时保持50Hz的PWM周期
}
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
int i,j,k,l;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; // PA6口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 最大输出频率为50Mhz
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 控制舵机反向旋转360°
// for (k = SERVO_MAX_PULSE_WIDTH; k >= 1300; k -= 20) {
// servo_rotate(k);
// }
for (l = 2000; l <= SERVO_MAX_PULSE_WIDTH; l += 56) {
servo_rotate(l);
}
这个地方,for()中第三个参数的自加值我是自己试出来的,我的目的是转45°,具体的我也不明白。
while(1) {
// 控制舵机正向旋转45°
// for ( i = SERVO_MIN_PULSE_WIDTH; i <= 1500; i += 10) {
// servo_rotate(i);
// }
// 控制舵机正向旋转360°
// for ( i = SERVO_MIN_PULSE_WIDTH; i <= SERVO_MAX_PULSE_WIDTH; i += 10) {
// servo_rotate(i);
// }
// for (j = SERVO_MAX_PULSE_WIDTH; j >= SERVO_MIN_PULSE_WIDTH; j -= 10) {
// servo_rotate(j);
// }
// 控制舵机反向旋转360°
// for (k = SERVO_MAX_PULSE_WIDTH; k >= 500; k -= 10) {
// servo_rotate(k);
// }
// for (l = SERVO_MIN_PULSE_WIDTH; l <= SERVO_MAX_PULSE_WIDTH; l += 10) {
// servo_rotate(l);
// }
}
}