專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32之TIM3_PWM程序

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月17日   【字體:

原理圖:
調(diào)PB5的亮度

 頭文件及完整例程下載:http://www.torrancerestoration.com/f/stm32標(biāo)準(zhǔn)例程庫(kù)函數(shù).rar

程序分析:

int main(void)
{
unsigned char a=0;
TIM_OCInitTypeDef  TIM3_OCInitStructure;
  RCC_Configuration();  
  time_ini();      
    SysTick_Config(72000);   //配置SYSTICK時(shí)鐘節(jié)拍為1ms一次
  while(1){
  Delay(1);  //延時(shí)1ms  
TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  //PWM模式2 
  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //輸出禁止        
  TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;  //確定占空比
  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
 
  /*調(diào)整CCR2_Val的值來(lái)改變占空比,逐步的控制LED1的亮度, 占空比大過(guò)一定值時(shí),
亮度的變化就不明顯了,所以CCR2_VAL最大設(shè)定到17000*/
if(a==0) CCR2_Val=CCR2_Val+10;  
else CCR2_Val=CCR2_Val-10;
if(CCR2_Val>17000){ CCR2_Val=17000; a=1;}  
else if(CCR2_Val<200){ CCR2_Val=200; a=0;} 
  }

} 

時(shí)鐘初始化打開(kāi)
RCC_APB2Periph_AFIO ,RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOCD| RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE

void RCC_Configuration(void){
 
  SystemInit(); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC 
  | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE , ENABLE);
} 

配置初始化,初始化PB5為復(fù)用輸出,TIM3部分映射到PB5,設(shè)置PWM的時(shí)鐘為72M/(3*2400)=10K,初始化TIM3時(shí)鐘,
占空比為
CCR2_Val /(TIM_Period  +1)

void time_ini(void){
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB5復(fù)用為TIM3的通道2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  /*TIM3局部復(fù)用功能開(kāi)啟 在TIM3的局部復(fù)用開(kāi)啟時(shí),PB5會(huì)被復(fù)用為TIM3_CH2*/
  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE); //TIM3部分映射到PB5  
 
   /*-------------------------------------------------------------------
  TIM3CLK=72MHz  預(yù)分頻系數(shù)Prescaler=2 經(jīng)過(guò)分頻 定時(shí)器時(shí)鐘為24MHz
  根據(jù)公式 通道輸出占空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的計(jì)數(shù)值  
  捕獲/比較寄存器2 TIM3_CCR2= CCR2_Val     
  -------------------------------------------------------------------*/
  TIM3_TimeBaseStructure.TIM_Prescaler = 2;    //預(yù)分頻器TIM3_PSC=3 24M
  TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計(jì)數(shù)器向上計(jì)數(shù)模式 TIM3_CR1[4]=0
  TIM3_TimeBaseStructure.TIM_Period =2399;            //自動(dòng)重裝載寄存器TIM3_APR  確定頻率為10KHz     
  TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0; //時(shí)鐘分頻因子 TIM3_CR1[9:8]=00
  TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
  TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure); //寫TIM3各寄存器參數(shù)
  
  TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計(jì)數(shù)時(shí),
     //一旦TIMx_CNT<TIMx_CCR1時(shí)通道1為無(wú)效電平,否則為有效電平
  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //輸入/捕獲2輸出允許  OC2信號(hào)輸出到對(duì)應(yīng)的輸出引腳PB5
  TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;    //確定占空比,這個(gè)值決定了有效電平的時(shí)間。
  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;    //輸出極性  低電平有效 TIM3_CCER[5]=1;
         
  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
  TIM_Cmd(TIM3,ENABLE); //啟動(dòng)定時(shí)器3 TIM3_CR1[0]=1; 
} 

    SysTick_Config(72000);   //配置SYSTICK時(shí)鐘節(jié)拍為1ms一次


  while(1){
  Delay(1);  //延時(shí)1ms  
TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;  //PWM模式2 
  TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //輸出禁止        
  TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;  //確定占空比
  TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; 
  TIM_OC2Init(TIM3, &TIM3_OCInitStructure);
 
  /*調(diào)整CCR2_Val的值來(lái)改變占空比,逐步的控制LED1的亮度, 占空比大過(guò)一定值時(shí),
亮度的變化就不明顯了,所以CCR2_VAL最大設(shè)定到17000*/
if(a==0) CCR2_Val=CCR2_Val+10;  
else CCR2_Val=CCR2_Val-10;
if(CCR2_Val>17000){ CCR2_Val=17000; a=1;}  
else if(CCR2_Val<200){ CCR2_Val=200; a=0;} 
   } 

 

 
關(guān)閉窗口