STM32學習筆記-PWM波形輸出

調試芯片:STM32F103C8T6

外部晶振:8MHz

功能介紹:使用Timer3實現兩路(可四路)PWM波形的輸出

代碼如下:

    初始化:系統時鐘初始化,GPIO端口初始化,Timer初始化

系統時鐘初始化:

 

  1. /* 配置系統時鐘爲72M */ 
  2. SystemInit(); 

 

GPIO端口初始化:

  1. /****************************************************************
  2.  * 函數名:void GPIO_Config(void) 
  3.  * 描述  :配置複用輸出PWM時用到的I/O 
  4.  * 輸入  :無 
  5.  * 輸出  :無 
  6.  * 調用  :main()調用 
  7.  ***************************************************************/ 
  8. void GPIO_Config(void)  
  9.   GPIO_InitTypeDef GPIO_InitStructure; 
  10.  
  11.   /* GPIOA and GPIOB clock enable */ 
  12.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  
  13.  
  14.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ 
  15.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7; 
  16.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 複用推輓輸出 
  17.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  18.   GPIO_Init(GPIOA, &GPIO_InitStructure); 

Timer初始化:

  1. /**************************************************************** 
  2.  * 函數名:void TIM3_Config(void)  
  3.  * 描述  :配置TIM3輸出的PWM信號的模式 
  4.  *      CH1:輸出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.6的PWM波(高電平在前,低電平在後) 
  5.  *      CH2:輸出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.4的PWM波(高電平在後,低電平在前) 
  6.  *      步驟一:通過T和TIMxCLK的時鐘源確定TIM_Period和TIM_Prescaler  
  7.  *          T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms  
  8.  *          因爲 TIM_Period<65535,所以 TIM_Prescaler>1,即 TIM_Prescaler=2 
  9.  *          所以 TIM_Period=59999=0xEA5F 
  10.  *      步驟二:根據TIM_Period的值,高低電平的先後D,確定CCR和TIM_OCPolarity 
  11.  *          CH1:因爲D=0.6,先高後低; 
  12.  *              所以CCR1=(TIM_Period+1)* D=36000;TIM_OCPolarity=TIM_OCPolarity_High 
  13.  *          CH2:因爲D=0.4,先高後低; 
  14.  *              所以CCR1=(TIM_Period+1)* (1-D)=36000;TIM_OCPolarity=TIM_OCPolarity_Low 
  15.  *      步驟三:基礎寄存器初始化 
  16.  *      步驟四:通道寄存器初始化 
  17.  *      步驟五:使能TIM3重載寄存器ARR 
  18.  *      步驟六:使能TIM3  
  19.  * 輸入  :無  
  20.  * 輸出  :無  
  21.  * 調用  :main()調用  
  22.  ***************************************************************/  
  23. void TIM3_Config(void)  
  24. {  
  25.     TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  
  26.     TIM_OCInitTypeDef  TIM_OCInitStructure;  
  27.     /* PWM信號電平跳變值 */  
  28.     u16 CCR1= 36000;          
  29.     u16 CCR2= 36000;  
  30.     /*PCLK1經過2倍頻後作爲TIM3的時鐘源等於72MHz*/  
  31.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  
  32.     /* Time base configuration */                                            
  33.     TIM_TimeBaseStructure.TIM_Period =0xEA5F;  
  34.     TIM_TimeBaseStructure.TIM_Prescaler = 2;                                    //設置預分頻:預分頻=2,即爲72/3=24MHz  
  35.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;                                //設置時鐘分頻係數:不分頻  
  36.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //向上計數溢出模式  
  37.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  
  38.     /* PWM1 Mode configuration: Channel1 */  
  39.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                           //配置爲PWM模式1  
  40.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                
  41.     TIM_OCInitStructure.TIM_Pulse = CCR1;                                       //設置跳變值,當計數器計數到這個值時,電平發生跳變  
  42.     TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High;                    //當定時器計數值小於CCR1時爲高電平  
  43.     TIM_OC1Init(TIM3, &TIM_OCInitStructure);                                    //使能通道1      
  44.     TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  
  45.     /* PWM1 Mode configuration: Channel2 */  
  46.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  47.     TIM_OCInitStructure.TIM_Pulse = CCR2;                                       //設置通道2的電平跳變值,輸出另外一個佔空比的PWM  
  48.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                    //當定時器計數值小於CCR2時爲低電平 
  49.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);                                    //使能通道2  
  50.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
  51.     TIM_ARRPreloadConfig(TIM3, ENABLE);                                         //使能TIM3重載寄存器ARR  
  52.     /* TIM3 enable counter */  
  53.     TIM_Cmd(TIM3, ENABLE);                                                      //使能TIM3   

     主函數代碼:

  1. /*************************************************************** 
  2.  * 函數名:main 
  3.  * 描述  :主函數 
  4.  * 輸入  :無 
  5.  * 輸出  :無 
  6.  ***************************************************************/ 
  7. int main(void
  8.     SystemInit(); 
  9.     GPIO_Config(); 
  10.     TIM3_Config(); 
  11.     while (1) 
  12.     { 
  13.      
  14.     } 

     最後上結果圖:

 

     疑問:雖然不影響用,但是爲什麼第一個週期不正確,正確的波形是從第二個週期開始輸出的?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章