中级会员
 
- 积分
- 380
- 金钱
- 380
- 注册时间
- 2014-12-13
- 在线时间
- 89 小时
|
发表于 2016-2-9 15:19:43
|
显示全部楼层
/**************************************************************************
通用定时器2-5的PWM模式
定时器的时钟频率如下:
AHB(72MHz)→APB1分频器(默认2)→APB1时钟信号(36MHz)→倍频器(*2倍)→通用定时器时钟信号(72MHz)。
因此CK_PSC就是72MHz了。
PWM的周期:是由定时器的自动重装值和CNT计数频率决定的。
而CNT的计数时钟是:
CK_PSC经分频器PSC得到,因此CNT的时钟就是CK_PSC/分频系数。这个分频系数
在TIM_TimeBaseStructure.TIM_Prescaler确定。我设置的值是72,因此CNT的计数
频率也就是CK_CNT的频率为1MHz。
下一步就是确定定时器自动重装值。因为CNT每自加到ARR寄存器的值时就会自动清零,
当然前提是设定为为向上计数模式,而就是根据这个溢出事件来改变PWM的周期。所以
PWM信号的频率由ARR的值来确定。我设置的值是1000-1,
即TIM_TimeBaseStructure.TIM_Period = 1000-1;因此PWM的周期是1MHz/1000=1KHz。
***************************************************************************/
#include"pwm.h"
//---------------------------------------------------------------------------
// 定时器2PWM模式
// 定时器2和定时器5的通道重复占用CH1-PA0 CH2-PA1 CH3-PA2 CH4-PA3
// 定时器2的重映射端口 CH1-PA15 CH2-PB3 CH3-PB10 CH4-PB11
//---------------------------------------------------------------------------
void TIMER2_GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
//选择引脚PA0 PA1 PA2 PA3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //输出频率最大50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
//通用定时器2初始化
//arr:自动重装值。
//psc:时钟预分频数
void TIMER2_config(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//打开定时器时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
//重新将Timer设置为缺省值
TIM_DeInit(TIM2);
//采用内部时钟给TIM2提供时钟源
TIM_InternalClockConfig(TIM2);
//CK_PSC/分频系数,这样计数器时钟为72MHz/72 = 1MHz
TIM_TimeBaseStructure.TIM_Prescaler = psc;
//设置时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//设置计数溢出大小,每计2000个数就产生一个更新事件
TIM_TimeBaseStructure.TIM_Period = arr-1;
//将配置应用到TIM2中
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
//使能ARR预装载缓冲器
TIM_ARRPreloadConfig(TIM2, ENABLE);
}
void TIMER2_PWM_config(u16 Dutyfactor)
{
TIM_OCInitTypeDef TimOCInitStructure;
//设置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM模式1输出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//设置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse = Dutyfactor;
//TIM输出比较极性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能输出状态
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
/*************通道1**************************/
//根据参数初始化PWM寄存器
TIM_OC1Init(TIM2, &TimOCInitStructure);
//使能TIMx在CCR1上的预装载寄存器
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);
/*************通道2**************************/
//根据参数初始化PWM寄存器
TIM_OC2Init(TIM2, &TimOCInitStructure);
//使能TIMx在CCR1上的预装载寄存器
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
/*************通道3**************************/
//根据参数初始化PWM寄存器
TIM_OC3Init(TIM2, &TimOCInitStructure);
//使能TIMx在CCR1上的预装载寄存器
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
/*************通道4**************************/
//根据参数初始化PWM寄存器
TIM_OC4Init(TIM2, &TimOCInitStructure);
//使能TIMx在CCR1上的预装载寄存器
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);
//设置TIM2的PWM输出为使能
TIM_CtrlPWMOutputs(TIM2,ENABLE);
//使能定时器
TIM_Cmd(TIM2, ENABLE);
}
/*****************************************************************************
MCU: STM32F103ZET6 晶振:8MHZ
液晶: R61505U 320X480
******************************************************************************/
#include"sys.h"
#include"usart.h"
#include "delay.h"
#include "tft.h"
#include "timer.h"
#include"pwm.h"
#define Dutyfactor 2500 //占空比为12%
//变量定义
extern u16 tem1;
/*------------------------------------------------------------
主函数
------------------------------------------------------------*/
int main(void)
{
delay_init(72); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
TFT_Initial();//LCD初始化
LCD_Clear(TFT_RED);
//delay_ms(1000);
TIM1_Int_Init(9,7199);//100ms
TIMER2_GPIO_config();//
TIMER2_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
TIMER2_PWM_config(Dutyfactor);
TIMER3_GPIO_config();//
TIMER3_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
TIMER3_PWM_config(Dutyfactor);
TIMER4_GPIO_config();//
TIMER4_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
TIMER4_PWM_config(Dutyfactor);
// TIMER5_GPIO_config();//
// TIMER5_config(20000,72);//72分频。PWM频率=1000000/19999=50hz
// TIMER5_PWM_config(Dutyfactor);
while(1)
{
LCD_ShowNum(10,50,tem1,5,32,TFT_YELLOW,TFT_RED);
TIM_SetCompare1(TIM2,tem1);//设置TIM2捕获比较1寄存器值
TIM_SetCompare2(TIM2,tem1);//设置TIM2捕获比较2寄存器值
TIM_SetCompare3(TIM2,tem1);//设置TIM2捕获比较3寄存器值
TIM_SetCompare4(TIM2,tem1);//设置TIM2捕获比较4寄存器值
TIM_SetCompare1(TIM3,tem1);//设置TIM3捕获比较1寄存器值
TIM_SetCompare2(TIM3,tem1);//设置TIM3捕获比较2寄存器值
TIM_SetCompare3(TIM3,tem1);//设置TIM3捕获比较3寄存器值
TIM_SetCompare4(TIM3,tem1);//设置TIM3捕获比较4寄存器值
TIM_SetCompare1(TIM4,tem1);//设置TIM4捕获比较1寄存器值
TIM_SetCompare2(TIM4,tem1);//设置TIM4捕获比较2寄存器值
TIM_SetCompare3(TIM4,tem1);//设置TIM4捕获比较3寄存器值
TIM_SetCompare4(TIM4,tem1);//设置TIM4捕获比较4寄存器值
// TIM_SetCompare1(TIM5,tem1);//设置TIM4捕获比较1寄存器值
// TIM_SetCompare2(TIM5,tem1);//设置TIM4捕获比较2寄存器值
// TIM_SetCompare3(TIM5,tem1);//设置TIM4捕获比较3寄存器值
// TIM_SetCompare4(TIM5,tem1);//设置TIM4捕获比较4寄存器值
}
}
实验通过的 |
|