一、舵机工作原理
控制信号由接收机的通道进入信号调制芯片,获得直流的偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速此轮带动电位器旋转,使得电压差为0,电机停止转动。 舵机的控制:一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分。本次实验的采用的舵机是180度伺服,控制关系如下:
二、舵机电路图
三、高级定时器产生PWM波
相比普通定时器1初始化中需要多加两句:
//重复计数器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
//主输出使能
TIM_CtrlPWMOutputs(TIM1, ENABLE);
四、代码
main.c
#include "motor.h"
#include <stdio.h>
#include "delay.h"
#include "stm32f10x.h"
#include "followline.h"
#include "ultrasonic.h"
#include "steeringengine.h"
u8 UART3_data,UART1_data;
u8 UART3_rcv[20],UART3_rcv_count;
u8 UART1_rcv[50],UART1_rcv_count,Uart1_finish;
int main(void)
{
// motor_pwm_TIME4_init(71,999);//电机PWM初始化
delay_init();//延迟初始化
// motor_GPIO_init();//电机管脚初始化、寻迹管脚初始化。
// uart_init1(9600);
// hwbz_gpio_init();
steer_gpio_init();
steering_pwm_TIME1_init(7199,199);
//int right_2=0,right_1=0 ,left_2=0,left_1=0;
while(1)
{
TIM_SetCompare4(TIM1,jd45);
delay_ms(800);
TIM_SetCompare4(TIM1,jd90);
delay_ms(800);
TIM_SetCompare4(TIM1,jd180);
delay_ms(800);
}
}
steeringengine.c
#include "steeringengine.h"
void steer_gpio_init(void )
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void steering_pwm_TIME1_init(int presc,int arr)
{
//定义定时器的结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
//定义定时器PWM输出通道的结构体
TIM_OCInitTypeDef TIM_OCInitStruct;
//打开TIME1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
//配置TIME1结构体的参数
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1 ;
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStruct.TIM_Prescaler = presc;
TIM_TimeBaseInitStruct.TIM_Period =arr;
//重复计数器的值
TIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);
//配置TIME1通道结构体的参数
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable ;
TIM_OCInitStruct.TIM_Pulse =0;
//TIME4通道4初始化
TIM_OC4Init(TIM1, &TIM_OCInitStruct);
//使能TIME4通道1的预存寄存器
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);
// TIM_ARRPreloadConfig(TIM1, ENABLE);
//使能TIME4
TIM_Cmd(TIM1, ENABLE);
}
steeringengine.h
#ifndef __STEERINGENGINE_H__
#define __STEERINGENGINE_H__
#include "stm32f10x_gpio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_rcc.h"
#define jd0 5
#define jd45 10
#define jd90 15
#define jd135 20
#define jd180 25
void steer_gpio_init(void );
void steering_pwm_TIME1_init(int presc,int arr);
#endif
文章评论