tim计时器读出为0_STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM配置

本文介绍了STM32 HAL库中定时器TIM的配置和PWM输出设置,包括频率设定、刹车和死区配置,以及通过通信动态调整PWM输出的方法。在启动定时器时,只需开启内部时钟源。详细讨论了定时器的时钟配置,如预分频器和自动重载寄存器的设置,以实现1s定时。
摘要由CSDN通过智能技术生成
7e84444ebe2824f09850650c58444bbe.png

基本流程:

1.配置定时器

2.开启定时器

3.动态改变pwm输出,改变值

HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1);

函数总结

__HAL_TIM_SET_COMPARE() // 是设置CCRx,一般是用在PWM输出的,控制PWM占空比__HAL_TIM_GET_COMPARE // 是用来读取CCRx的,一般用于捕获处理

PWM输出配置:

2a8bdaf2ea2fd3e1305873e238c6e74c.png

频率设置:

static void MX_TIM2_Init(void){ TIM_MasterConfigTypeDef sMasterConfig; TIM_IC_InitTypeDef sConfigIC; TIM_OC_InitTypeDef sConfigOC; htim2.Instance = TIM2; htim2.Init.Prescaler = (36-1); //实际时钟频率为 72M/36=2MHz /40000=50H,-----490HZ,改变观察电机输出状态 定时器预分频器 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = (4082-1); //定时器周期配置 PWM频率为 490KHz 定义定时器周期,PWM频率为:168MHz/ (L298N_TIMx_PRESCALER+1)/ (L298N_TIM_PERIOD+1) htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频 //高级定时器重复计数寄存器值  **高级才有// 定义高级定时器重复计数寄存器值//实际PWM频率为:72MHz/(L298N_TIMx_PRESCALER+1)/(L298N_TIM_PERIOD+1)/(L298N_TIM_REPETITIONCOUNTER+1)#define L298N_TIM_REPETITIONCOUNTER 0**

刹车和死区配置

/* 刹车和死区时间配置 */ sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; sBreakDeadTimeConfig.DeadTime = 0; sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; HAL_TIMEx_ConfigBreakDeadTime(&htimx_L298N, &sBreakDeadTimeConfig);

基于通信的pwm频率和脉宽的更新控制算法

/*** pwm是否需要更新,比较上一次的频率和脉宽值,如果不同,则更新*/void pwm_update_loop( void ){ /*1,第一路判断: 频率 或 占空比发生变化 */ if( (HLM_SOKO_I_FREQ != HLM_SOKO_I_FREQ_LAST ) || HLM_SOKO_I_DUTY != HLM_SOKO_I_DUTY_LAST ) { /* 更新 频率和占空比的记录值 */ HLM_SOKO_I_FREQ_LAST = HLM_SOKO_I_FREQ; HLM_SOKO_I_DUTY_LAST = HLM_SOKO_I_DUTY; /* 更新当前通道的PWM波形 */ pwm_update( PWM_I,HLM_SOKO_I_FREQ, HLM_SOKO_I_DUTY ); }  /*2,第二路判断 */ if( (HLM_SOKO_II_FREQ != HLM_SOKO_II_FREQ_LAST ) || HLM_SOKO_II_DUTY != HLM_SOKO_II_DUTY_LAST ) { /* 更新 频率和占空比的记录值 */ HLM_SOKO_II_FREQ_LAST = HLM_SOKO_II_FREQ; HLM_SOKO_II_DUTY_LAST = HLM_SOKO_II_DUTY; /* 更新当前通道的PWM波形 */ pwm_update( PWM_II,HLM_SOKO_II_FREQ, HLM_SOKO_II_DUTY ); }  /*3,第三路判断 */ if( (HLM_SOKO_III_FREQ != HLM_SOKO_III_FREQ_LAST ) || HLM_SOKO_III_DUTY != HLM_SOKO_III_DUTY_LAST ) { /* 更新 频率和占空比的记录值 */ HLM_SOKO_III_FREQ_LAST = HLM_SOKO_III_FREQ; HLM_SOKO_III_DUTY_LAST = HLM_SOKO_III_DUTY; /* 更新当前通道的PWM波形 */ pwm_update( PWM_III,HLM_SOKO_III_FREQ, HLM_SOKO_III_DUTY ); } }

补充:

开起定时器功能

只要在相应的定时器下开始内部时钟源即可使用定时器功能

8ab4246a61511613128a02650ccf451d.png

定时器内部动能:

80b1c3427463cfc7be3933601b8ad860.png

定时器时钟配置:

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,这里我们没有用到这个功能,参数为默认设置。

a05e3a9f31b027e2b846fbdf908694d2.png
ddc4aef7515e354e74a94bbdddfc031d.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值