welcom ! Handel home

2014年7月24日 星期四

STM32 PWM by TIM3 demo Note


TIM3 PWM  輸出定義 (CH1 ..4) 


TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 
TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100 
TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100 
TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100 

PA.06: (TIM3_CH1)
PA.07: (TIM3_CH2)
PB.00: (TIM3_CH3)


PB.01: (TIM3_CH4)


  • PWM configuration
    • TIM_Prescaler : 將TIMxCLK除以(TIM_Prescaler + 1)
    • TIM_CounterMode : 選擇計數模式
    • TIM_Period : TIMx_ARR,counter 週期
    • TIM_OCPolarity: 設置輸出極性
    • TIM_OCMode: PWM模式
      • PWM 1 Mode :
        • 在向計數,TIMx_CNT時,輸出為1,否則輸出為0;
        • 在向計數,TIMx_CNT>TIMx_CCRx時,輸出為0,否則輸出為1。
      • PWM 2 Mode :
        • 在向計數,TIMx_CNT時,輸出為0,否則輸出為1;
        • 在向計數,TIMx_CNT>TIMx_CCRx時,輸出為1,否則輸出為0。
    • TIM_Pulse: 即TIMx_CCRx暫存器,設定脈衝寬度
    • 輸出脈波週期 = (TIM_Period + 1) * (TIM_Prescaler + 1) / TIMxCLK
     











Demo Code

調試晶片:STM32F103C8T6
外部晶振:8MHz
功能介紹:使用Timer3實現兩路(可四路)PWM波形的輸出
代碼如下:
    初始化:系統時鐘初始化,GPIO埠初始化,Timer初始化
[list Flow]
系統時鐘初始化: 
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. 
10.   GPIO_InitTypeDef GPIO_InitStructure; 
11.  
12.   /* GPIOA and GPIOB clock enable */ 
13.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  
14.  
15.   /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */ 
16.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7; 
17.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           // 複用推挽輸出 
18.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
19.   GPIO_Init(GPIOA, &GPIO_InitStructure); 
20.
[ Timer初始化:]
1.  /**************************************************************** 
2.   * 函數名:void TIM3_Config(void)  
3.   * 描述  :配置TIM3輸出的PWM信號的模式 
4.   *      CH1:輸出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.6PWM(高電平在前,低電平在後) 
5.   *      CH2:輸出 T=2.5ms(f=1/2.5ms=400Hz)  D=0.4PWM(高電平在後,低電平在前) 
6.   *      步驟一:通過TTIMxCLK的時鐘源確定TIM_PeriodTIM_Prescaler  
7.   *          T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=2.5ms  
8.   *          因為 TIM_Period<65535 span="">,所以 TIM_Prescaler>1, TIM_Prescaler=2 
9.   *          所以 TIM_Period=59999=0xEA5F 
10.  *      步驟二:根據TIM_Period的值,高低電平的先後D,確定CCRTIM_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模式 
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);             //使能通道 
50.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  
51.     TIM_ARRPreloadConfig(TIM3, ENABLE);         //使能TIM3重載寄存器ARR  
52.     /* TIM3 enable counter */  
53.     TIM_Cmd(TIM3, ENABLE);                               //使能TIM3   
54.
     主函數代碼:
1.  /*************************************************************** 
2.   * 函數名:main 
3.   * 描述  :主函數 
4.   * 輸入  :無 
5.   * 輸出  :無 
6.   ***************************************************************/ 
7.  int main(void
8. 
9.      SystemInit(); 
10.     GPIO_Config(); 
11.     TIM3_Config(); 
12.     while (1) 
13.     { 
14.      
15.     } 
16.





沒有留言: