基本流程:
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,這里我們沒有用到這個功能,參數為默認設置。