一、舵機作業原理
控制信號由接識訓的通道進入信號調制芯片,獲得直流的偏置電壓,它內部有一個基準電路,產生周期為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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298176.html
標籤:其他
