STM32 HAL 库学习系列 编号 定时器 TIM ----- 启动定时器和 PWM 输出配置
最编程
2024-06-09 17:58:58
...
【深圳】源创会:5.26下午、轰趴馆等你”
基本流程:
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,这里我们没有用到这个功能,参数为默认设置。