项目六:定时器一产生PWM控制舵机

一、舵机工作原理

    控制信号由接收机的通道进入信号调制芯片,获得直流的偏置电压。它内部有一个基准电路,产生周期为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

猜你喜欢

转载自blog.csdn.net/qq_47541315/article/details/120142019
今日推荐