新手上路
- 积分
- 35
- 金钱
- 35
- 注册时间
- 2020-9-9
- 在线时间
- 10 小时
|
5金钱
pwm.c
#include "pwm.h"
#include "led.h"
#include "usart.h"
//TIM14 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//1)开启 TIM14 和 GPIO 时钟,配置 PA7 选择复用功能 (TIM14)输出。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟
GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_TIM14); //GPIOA7复用为定时器14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //GPIOA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA7
GPIO_ResetBits(GPIOA,GPIO_Pin_7); //输出低电平
//2)初始化 TIM14,设置 TIM14 的 ARR 和 PSC 等参数。
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
//3)设置 TIM14_CH1 的 PWM 模式,使能 TIM14 的 CH1 输出。在库函数中,PWM 通道
//设置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的,不同的通道的设置函数不一样,这里
//我们使用的是通道 1,所以使用的函数是 TIM_OC1Init()。
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择PWM模式:TIM脉冲宽度调制模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性低:比较输出极性就是选择哪个电平为有效电平
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
//没有初始化uint16_t TIM_Pulse; CCR比较值,写CCRx,这个一般在外部设置,也可以写0
//4)使能 TIM 的自动重载预装载及ARR更新机制
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCRx上的自动重载预装载(位 7 ARPE),寄存器是否进行缓冲
TIM_ARRPreloadConfig(TIM14,ENABLE);//输出比较预装载使能,ARPE使能,ARR更新了,还是现在有效
//5)使能 TIM14。
TIM_Cmd(TIM14, ENABLE); //使能TIM14
//6)修改 TIM14_CCR1 来控制占空比。最后,在经过以上设置之后,PWM 其实已经开始输出了,只是其占空比和频率都是固定
//的,而我们通过修改 TIM14_CCR1 则可以控制 CH1 的输出占空比。继而控制 DS0 的亮度。
//在库函数中,修改 TIM14_CCR1 占空比的函数是:void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare2);
//理所当然,对于其他通道,分别有一个函数名字,函数格式为 TIM_SetComparex(x=1,2,3,4)
}
//补充:高级定时器虽然和通用定时器类似,但是高级定时器要想输出 PWM,必须还要设置一
//个 MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。库函数设置的函数
//为:
//void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
mian.c
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
//20ms -> 1000
//0.5/20=0.025 -> 1000*0.025 = 25(0度)
//1.5/20=0.075 -> 1000*0.075 = 75(90度)
//2.5/20=0.125 -> 1000*0.125 = 125(180度)
char value[] = {75, 125, 25};//0-90-180
int main(void)
{
char i = 0;
delay_init(168); //初始化延时函数
LED_Init();
//NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
//uart_init(115200);//初始化串口波特率为115200
TIM14_PWM_Init(1000-1,1680-1); //(1680)//84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. 0.5ms
while(1) //实现比较值从0-300递增,到300后从300-0递减,循环
{
LED_test(2,2000);
TIM_SetCompare1(TIM14,value[i]); //修改比较值,修改占空比
i++;
if(i > 2) i = 0;
}
}
舵机现象:舵机有点卡的情况,但不转;手动可以转动,
|
|