<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> STM32 >> 瀏覽文章

        STM32之TIM3_PWM程序

        作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月17日   【字體:

        原理圖:
        調PB5的亮度

         頭文件及完整例程下載:http://www.thefapper.com/f/stm32標準例程庫函數.rar

        程序分析:

        int main(void)
        {
        unsigned char a=0;
        TIM_OCInitTypeDef  TIM3_OCInitStructure;
          RCC_Configuration();  
          time_ini();      
            SysTick_Config(72000);   //配置SYSTICK時鐘節拍為1ms一次
          while(1){
          Delay(1);  //延時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);
         
          /*調整CCR2_Val的值來改變占空比,逐步的控制LED1的亮度, 占空比大過一定值時,
        亮度的變化就不明顯了,所以CCR2_VAL最大設定到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;} 
          }

        } 

        時鐘初始化打開
        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為復用輸出,TIM3部分映射到PB5,設置PWM的時鐘為72M/(3*2400)=10K,初始化TIM3時鐘,
        占空比為
        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復用為TIM3的通道2
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOB, &GPIO_InitStructure);
          /*TIM3局部復用功能開啟 在TIM3的局部復用開啟時,PB5會被復用為TIM3_CH2*/
          GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE); //TIM3部分映射到PB5  
         
           /*-------------------------------------------------------------------
          TIM3CLK=72MHz  預分頻系數Prescaler=2 經過分頻 定時器時鐘為24MHz
          根據公式 通道輸出占空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的計數值  
          捕獲/比較寄存器2 TIM3_CCR2= CCR2_Val     
          -------------------------------------------------------------------*/
          TIM3_TimeBaseStructure.TIM_Prescaler = 2;    //預分頻器TIM3_PSC=3 24M
          TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數模式 TIM3_CR1[4]=0
          TIM3_TimeBaseStructure.TIM_Period =2399;            //自動重裝載寄存器TIM3_APR  確定頻率為10KHz     
          TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鐘分頻因子 TIM3_CR1[9:8]=00
          TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0;
          TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure); //寫TIM3各寄存器參數
          
          TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;    //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計數時,
             //一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平
          TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    //輸入/捕獲2輸出允許  OC2信號輸出到對應的輸出引腳PB5
          TIM3_OCInitStructure.TIM_Pulse = CCR2_Val;    //確定占空比,這個值決定了有效電平的時間。
          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); //啟動定時器3 TIM3_CR1[0]=1; 
        } 

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


          while(1){
          Delay(1);  //延時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);
         
          /*調整CCR2_Val的值來改變占空比,逐步的控制LED1的亮度, 占空比大過一定值時,
        亮度的變化就不明顯了,所以CCR2_VAL最大設定到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;} 
           } 

         

         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮