使用TIM2:PA0-TIM2_CH1;PA1-TIM2_CH2;PA2-TIM2_CH3;PA0-2接三个舵机。三个舵机分别3个指示灯,PB5-PB7。不动时三个灯全亮,动哪一个其余两个灯熄灭。
主程序:
#include "stm32f10x.h" //STM32头文件
#include "sys.h"
#include "delay.h"
#include "pwm.h"
#include "MG996.h"
#include "led.h"
int main (void)//主程序
{
delay_ms(500); //上电时等待其他器件就绪
RCC_Configuration(); //系统时钟初始化
TIM2_PWM_Init(59999,23); //设置频率为50Hz,公式为:溢出时间Tout(单位秒)=(arr+1)(psc+1)/Tclk 20MS = (59999+1)*(23+1)/72000000
//Tclk为通用定时器的时钟,如果APB1没有分频,则就为系统时钟,72MHZ
//PWM时钟频率=72000000/(59999+1)*(23+1) = 50HZ (20ms),设置自动装载值60000,预分频系数24
LED_Init(); //LED驱动初始化
LEDstate_Init(); //led三个灯初始化先闪烁5次
MG996_Init(); //三个舵机角度初始化
delay_s(2);
while(1)
{
MG996_angle1(2000);
delay_s(2);
MG996_angle2(3000);
delay_s(2);
MG996_angle3(4000);
delay_s(1);
MG996_angle1(7500);
MG996_angle2(7500);
MG996_angle3(7500);
delay_s(3);
}
}
PWM驱动程序:
#include "pwm.h"
void TIM2_PWM_Init(u16 arr,u16 psc)//TIM2 PWM初始化 arr重装载值 psc预分频系数
{
GPIO_InitTypeDef GPIO_InitStrue;
TIM_OCInitTypeDef TIM_OCInitStrue;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //使能TIM2和相关GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟(TIM2_CH1,CH2,CH3在PA引脚上)
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; // TIM2_CH1,TIM2_CH2,TIM2_CH3
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; // 复用推挽
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz; //设置最大输出速度
GPIO_Init(GPIOA,&GPIO_InitStrue); //GPIO端口初始化设置
TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值,TIM_TimeBaseInitStrue用来设置基本频率
TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数
TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出
TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStrue); //TIM2初始化设置(设置PWM的周期)
TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM1; // PWM模式1:CNT < CCR时输出有效电平,TIM_OCInit是配置输出通道
TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High;// 设置极性-有效电平为:高电平
TIM_OCInitStrue.TIM_Pulse =0;
TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
TIM_OC3Init(TIM2,&TIM_OCInitStrue); //TIM2的通道3 PWM 模式设置
TIM_OC2Init(TIM2,&TIM_OCInitStrue); //TIM2的通道2 PWM 模式设置
TIM_OC1Init(TIM2,&TIM_OCInitStrue); //TIM2的通道2 PWM 模式设置
TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable); //使能预装载寄存器
TIM_Cmd(TIM2,ENABLE); //使能TIM2
}