基于stm32的pwm呼吸燈
使用定時器來控制I/O口輸出PWM波形,從而驅動LED燈出現(xiàn)類似呼吸頻率一般的亮滅。
硬件電路圖:
我的收獲:
這是STM32數(shù)據(jù)手冊上對TIM3通用定時器復用功能重映象的描述,假設讓PA6作為PWM輸出,從圖中可以看出PA6對應TIM3的通道1,
使能TIM3通道1的函數(shù)為
TIM_OC1Init();1
同樣的,如果想要使能PA7,它對應的是TIM3的通道2,那么使能通道2的函數(shù)便是:
TIM_OC2Init()1
以此類推,需要注意,使能不同相同定時器不同通道的函數(shù)是有一點小差別的,防止在程序中調用TIM_OC1Init()函數(shù)來使能TIM3通道2這種情況的發(fā)生。
注意看這里,假設使用的是TIM3的通道1,那么這里就要寫成
TIM3-》CCR11
類似的如果用TIM3定時器的通道2,這里就要相應的改為
TIM3-》CCR21
這同樣是為了防止本來計劃使用的是TIM3的通道1,反而在這里自擺烏龍寫為了TIM-》CCR2的情況,這樣的錯誤一般很隱蔽,不容易查找。
相應的程序已經上傳,但是不知道為什么在這里無法顯示程序的下載地址,需要下載可以去我的資源里下載。
工程文件為
Progect–》RVMDK(uv4)–》iSO_STM32
STM32PWM輸出實現(xiàn)LED燈漸亮漸滅程序:
/**說明:
*PA0:KEY1;PA1:KEY2;
*PA2:LED1;PA3:LED2;
*PA9:USART1_TX;PA10:USART1_RX
*/
#include “stm32f10x.h”
#include “stm32f10x_rcc.h”
#include “stm32f10x_gpio.h”
#include “stm32f10x_tim.h”
#include “stm32f10x_pwr.h”
#include “stm32f10x_exti.h”
#include “system_stm32f10x.h”
#include “misc.h”
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM2_Configuration(void);
void delay_ms(u16 time);
int main()
{
u8 led_fx=1;
u16 led_dt=0;
RCC_Configuration();
GPIO_Configuration();
TIM2_Configuration();
while(1)
{
delay_ms(10);
if(led_fx==1)
{
led_dt++;
}else{
led_dt--;
}
if(led_dt》100) led_fx=0;//可以和初始值一樣
if(led_dt==0) led_fx=1;
TIM_SetCompare3(TIM2,led_dt);//通道3沒有重影像是PA2對應LED1
TIM_SetCompare4(TIM2,led_dt);//通道4沒有重影像是PA3對應LED2
}
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
//GPIO_AFIODeInit();和下面相同效果,可以查看源碼證明
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//端口映射函數(shù)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;//GPIO_Pin_3對應channel3,主函數(shù)改為:TIM_SetCompare3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void TIM2_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
//定時器初始化
TIM_TimeBaseStructure.TIM_Period = 100-1;//初始值是100,2MHz=2000KHz,2MHz/100=0.02MHz,所有周期T=1/0.02MHz=50us,示波器顯示周期應該為50us
TIM_TimeBaseStructure.TIM_Prescaler = 36-1;//36倍分頻,72MHz/36=2MHz
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//PWM初始化
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 50;//占空比值是50,所以占空比是:50/100=50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse = 20;
TIM_OC4Init(TIM2,&TIM_OCInitStructure);
//TIM_OC3PreloadConfig(TIM2,TIM_OCPreload_Enable);
//TIM_ARRPreloadConfig(TIM2, ENABLE);
TIM_Cmd(TIM2,ENABLE);
TIM_CtrlPWMOutputs(TIM2,ENABLE);
}
void delay_ms(u16 time)
{
u16 i=0;
while(time--)
{
i=12000;
while(i--);
}
}
-
PWM
+關注
關注
114文章
5186瀏覽量
213972 -
STM32
+關注
關注
2270文章
10900瀏覽量
356091 -
呼吸燈
+關注
關注
10文章
110瀏覽量
42736
發(fā)布評論請先 登錄
相關推薦
評論