STM32 HAL庫學習系列第4篇 定時器TIM----- 開始定時器與PWM輸出配置


 

 

基本流程:

1.配置定時器

2.開啟定時器

3.動態改變pwm輸出,改變值

 HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);

 

函數總結:

1 __HAL_TIM_SET_COMPARE()   // 是設置CCRx,一般是用在PWM輸出的,控制PWM占空比
2 __HAL_TIM_GET_COMPARE      // 是用來讀取CCRx的,一般用於捕獲處理

PWM輸出配置:

頻率設置:

 1 static void MX_TIM2_Init(void)
 2 {
 3   TIM_MasterConfigTypeDef sMasterConfig;
 4   TIM_IC_InitTypeDef sConfigIC;
 5   TIM_OC_InitTypeDef sConfigOC;
 6   htim2.Instance = TIM2;
 7   htim2.Init.Prescaler = (36-1);     //實際時鍾頻率為 72M/36=2MHz  /40000=50H,-----490HZ,改變觀察電機輸出狀態  定時器預分頻器
 8   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
 9   htim2.Init.Period = (4082-1); //定時器周期配置    PWM頻率為 490KHz                                                                   定義定時器周期,PWM頻率為:168MHz/ (L298N_TIMx_PRESCALER+1)/  (L298N_TIM_PERIOD+1)                                htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;     // 時鍾分頻
10                                       //高級定時器重復計數寄存器值   
11      **高級才有
12 // 定義高級定時器重復計數寄存器值
13 //實際PWM頻率為:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)
14 #define L298N_TIM_REPETITIONCOUNTER        0
15 **

剎車和死區配置:

1 /* 剎車和死區時間配置 */
2   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
3   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
4   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
5   sBreakDeadTimeConfig.DeadTime = 0;
6   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
7   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
8   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
9   HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);

基於通信的pwm頻率和脈寬的更新控制算法:

 1 /*
 2 ** pwm是否需要更新,比較上一次的頻率和脈寬值,如果不同,則更新
 3 */
 4 void pwm_update_loop( void )
 5 {
 6     /*1,第一路判斷: 頻率 或 占空比發生變化 */
 7     if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) ||
 8          HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST   )
 9     {
10         /* 更新 頻率和占空比的記錄值 */
11         HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ;
12         HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY;
13         /* 更新當前通道的PWM波形 */
14         pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY );
15     }
16        
17     /*2,第二路判斷 */
18     if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) ||
19          HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST   )
20     {
21         /* 更新 頻率和占空比的記錄值 */
22         HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ;
23         HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY;
24         /* 更新當前通道的PWM波形 */
25         pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY );
26     }
27    
28     /*3,第三路判斷 */
29     if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) ||
30          HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST   )
31     {
32         /* 更新 頻率和占空比的記錄值 */
33         HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ;
34         HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY;
35         /* 更新當前通道的PWM波形 */
36         pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY );
37     }   
38 }

補充:

開起定時器功能 

只要在相應的定時器下開始內部時鍾源即可使用定時器功能

定時器內部動能:

定時器時鍾配置:

M是10的6次方

微秒是10的-6次方

內部時鍾設置為不分頻(CKD),則CK_PSC的時鍾頻率等於APB1的時鍾頻率108MHz,即108000 000Hz。若要定時時間為1s,則即可設置10800分頻(預分頻器寄存器 (TIMx_PSC)的值為10800-1),定時器的時鍾CK_CNT的頻率為10000Hz.則自動重載寄存器 (TIMx_ARR)設置為10000-1即定時為1s.TRGO為觸發輸出,可以觸發內部ADC/DAC,這里我們沒有用到這個功能,參數為默認設置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM