使用TIM3定时输出PWM控制LED灯实现呼吸灯
2016-07-04 22:43
555 查看
/*************************************
使用TIM3定时输出PWM控制LED灯实现呼吸灯
**************************************/
void BreathLightInit()//LED初始化
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void PwmInit()//PWM初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
//step1:开启时针
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启管脚复用时针
//step2:初始化定时器TIM3
TIM_TimeBaseInitStructure.TIM_Period = 900;
//不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//设置用来作为TIMx时钟频率预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
//step3:改变指定管脚的映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //PC7
//step4:初始化PWM
//PWM初始化 //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
//step5:使能TIMx在CCR2上的预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
}
int main()
{
u8 fx = 1;//方向
u32 CCRx = 0;//CCRx值
BreathLightInit();
PwmInit();
while(1)
{
DelayMs(10);
if(1 == fx)
{
CCRx++;
if(300 == CCRx )
{
fx = 0;
}
}
else
{
CCRx--;
if( 0 == CCRx )
{
fx = 1;
}
}
TIM_SetCompare2(TIM3, CCRx);//设置TIMx捕获比较2寄存器值
}
}
补充说明:
如果是PWM1模式
如果设置TIM_OCPolarity_High TIMx_CNT<TIMx_CCR输出为高电平 TIMx_CNT>TIMx_CCR输出为低电平
如果设置TIM_OCPolarity_Low TIMx_CNT<TIMx_CCR输出就为低电平 TIMx_CNT><TIMx_CCR输出就为高电平
如果是PWM2模式
如果设置TIM_OCPolarity_High TIMx_CNT<TIMx_CCR输出为低电平 TIMx_CNT>TIMx_CCR输出为高电平
如果设置TIM_OCPolarity_Low TIMx_CNT<TIMx_CCR输出就为高电平 TIMx_CNT>TIMx_CCR输出就为低电平
总结:设置TIM_OCPolarity_High,则输出电平与CCxREF的电平相同
设置TIM_OCPolarity_Low,则输出电平与CCxREF的电平相反
使用TIM3定时输出PWM控制LED灯实现呼吸灯
**************************************/
void BreathLightInit()//LED初始化
{
GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO
/* 开启时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void PwmInit()//PWM初始化
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明一个结构体变量,用来初始化定时器
TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx
//step1:开启时针
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//开启TIM3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启管脚复用时针
//step2:初始化定时器TIM3
TIM_TimeBaseInitStructure.TIM_Period = 900;
//不分频,PWM 频率=72000/900=8Khz//设置自动重装载寄存器周期的值
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;//设置用来作为TIMx时钟频率预分频值
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//TIM向上计数模式
TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);
TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
//step3:改变指定管脚的映射
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); //PC7
//step4:初始化PWM
//PWM初始化 //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//输出比较模式
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//输出极性
TIM_OC2Init(TIM3,&TIM_OCInitStructure);
//step5:使能TIMx在CCR2上的预装载寄存器
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
}
int main()
{
u8 fx = 1;//方向
u32 CCRx = 0;//CCRx值
BreathLightInit();
PwmInit();
while(1)
{
DelayMs(10);
if(1 == fx)
{
CCRx++;
if(300 == CCRx )
{
fx = 0;
}
}
else
{
CCRx--;
if( 0 == CCRx )
{
fx = 1;
}
}
TIM_SetCompare2(TIM3, CCRx);//设置TIMx捕获比较2寄存器值
}
}
补充说明:
如果是PWM1模式
如果设置TIM_OCPolarity_High TIMx_CNT<TIMx_CCR输出为高电平 TIMx_CNT>TIMx_CCR输出为低电平
如果设置TIM_OCPolarity_Low TIMx_CNT<TIMx_CCR输出就为低电平 TIMx_CNT><TIMx_CCR输出就为高电平
如果是PWM2模式
如果设置TIM_OCPolarity_High TIMx_CNT<TIMx_CCR输出为低电平 TIMx_CNT>TIMx_CCR输出为高电平
如果设置TIM_OCPolarity_Low TIMx_CNT<TIMx_CCR输出就为高电平 TIMx_CNT>TIMx_CCR输出就为低电平
总结:设置TIM_OCPolarity_High,则输出电平与CCxREF的电平相同
设置TIM_OCPolarity_Low,则输出电平与CCxREF的电平相反
相关文章推荐
- ARM9 S3C2440 定时器中断
- nginx log 时间转换时间戳在php,perl,python中的使用
- 软件模拟PWM
- STM32 配置定时器让引脚输出PWM波形
- msp430中adc12与PWM配合使用
- AURIX系列GTM模块中的PWM部分
- stm32f10x基本定时器驱动
- AT91SAM9G45 PWM应用
- 松下A5电机X4与上位机连接
- STC15W4K48S4 它有6通道高精度PWM发生器
- STM32呼吸灯
- linux下PWM程序设计
- nucleo STM32F072 PWM 测试
- nucle LED 调光PWM
- PWM的简单理解
- DA1458x使用之第二篇——PWM
- zrobot----------小车的运动控制
- STM32F4 Discovery TIM3 PWM Driver
- IBM TIM API 使用手册
- 标记 Arduino M0 板子如何更改PWM输出频率