历史上的今天
今天是:2025年06月21日(星期六)
2019年06月21日 | STM32 HAL库学习系列第4篇 定时器TIM--开始定时器与PWM输出配置
2019-06-21 来源:eefocus
基本流程:
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输出配置:

频率设置:
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 );
}
}
补充:
开起定时器功能
只要在相应的定时器下开始内部时钟源即可使用定时器功能

定时器内部动能:

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


史海拾趣
|
大家群策群力共同打造新一代的电子行业新景象!谢谢各位参与。也可以联系我与我共同进步和发展!!MSN:wangqingtao2119@lginnotek.com… 查看全部问答> |
|
用普通的元件(不能用IC,555可以用),普通的开关(不是按钮)即只有两种态,接通/闭合; 要求:开关被打到闭合壮态时,LED亮10分钟后熄灭, 开关被打到接通壮态时,LED亮10分钟后熄灭, & ...… 查看全部问答> |
|
利用下面一段代码重启,发现好像是系统注销了,并没有关机重启,请问哪个地方需要修改,或者还有别的方法? #define IOCTL_HAL_REBOOT CTL_CODE(FILE_DEVICE_HAL, 15, METHOD_BUFFERED, FILE_ANY_ACCESS) #include extern \"C\" __declspec(dll ...… 查看全部问答> |
|
下面是nboot loader.h中的一段定义: // NAND Boot (loads into SteppingStone) @ Block 0 #define NBOOT_BLOCK 0 #define NBOOT_BLOCK_SIZE ...… 查看全部问答> |
|
怎么老是碰到点稀奇古怪的问题。ADC初始化后,那几个ADC寄存器的值始终不变,搞怪的 看下面的图: 程序已经正常跑了,然后我暂停,查看寄存器的值, 下载 (47.48 KB) 2010-9-27 11:07 PB_DDR=0x07和TIM1_ARRL=0xc6都 ...… 查看全部问答> |
|
版主,STM32FSMCmultimaster的问题还挂着吗 st的errata说stm32的fsmc在multi master访问时会bus fault,这个问题不知是否仍存在于新批号的芯片中?我目前的项 ...… 查看全部问答> |
|
Proteus 7.7汉化 破解版 免费下载Proteus VSM CPU Models: 新增单片机PIC18F8680, PIC18F8585MSP430F2112, MSP430F2122, MSP430F2132, MSP430F2232, MSP430F2252, MSP430F2272MSP430F233, MSP430F235, MSP430F247, MSP430F248, MSP430F249, MSP430F ...… 查看全部问答> |
|
XC2S500E 5PQ208I这款FPGA时钟最高能到多少M?100M有么?看了说明书这个芯片是steping0,只能到90M 还有这款芯片有军工级的么? 在线等大虾… 查看全部问答> |




