void timer_PWM_init(TIM_TypeDef *TIMx, uint32_t tim_ch)
LL_TIM_InitTypeDef TIM_InitStruct = {0};
timer_clk_irq_config(TIMx, 0);
TIM_InitStruct.Prescaler = 71;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 999;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
LL_TIM_Init(TIMx, &TIM_InitStruct);
LL_TIM_DisableARRPreload(TIMx);
LL_TIM_OC_EnablePreload(TIMx, tim_ch);
TIM_OC_InitStruct.OCMode = LL_TIM_OCMODE_PWM1;
TIM_OC_InitStruct.OCState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.OCNState = LL_TIM_OCSTATE_DISABLE;
TIM_OC_InitStruct.CompareValue = 500;
TIM_OC_InitStruct.OCPolarity = LL_TIM_OCPOLARITY_HIGH;
LL_TIM_OC_Init(TIMx, tim_ch, &TIM_OC_InitStruct);
LL_TIM_OC_DisableFast(TIMx, tim_ch);
LL_TIM_SetTriggerOutput(TIMx, LL_TIM_TRGO_RESET);
LL_TIM_DisableMasterSlaveMode(TIMx);
timer_io_init();
void timer_PWM_freq_set(TIM_TypeDef *TIMx, uint32_t tim_ch, uint16_t freq)
LL_TIM_DisableCounter(TIMx);
LL_TIM_SetPrescaler(TIMx, 7200-1);
LL_TIM_SetAutoReload(TIMx, (uint16_t)((10000/freq))-1);
- 问题现象:
调用:timer_PWM_freq_set(TIM3, LL_TIM_CHANNEL_CH4, 1000)
PWM没问题,1KHz,占空比50%
但是,调用:timer_PWM_freq_set(TIM3,LL_TIM_CHANNEL_CH4,100)
出问题了,PWM一直是高定平。
- 问题分析:
因为初始化PWM的频率为1K,计数周期为500,占空比为50%
但是在后面修改频率后并未修改计数周期,也就是频率为100HZ,计数周期还是500,计数周期大于频率了,于是就出现一直高电平的现象。(个人分析的,不知正确与否,应该是这样的。。。。)
- 解决方法:
修改频率的同时也要修改计数周期,要保证计数周期小于频率,不然占空比比周期还长,自然就一直高定平或者低电平了
- 代码修改:
* @brief 设置PWM输出频率
* @param fre取值范围(1-10000)Hz
* @retval 设置完成频率之后不启动定时器
void timer_PWM_freq_set(TIM_TypeDef *TIMx, uint32_t tim_ch, uint16_t freq)
LL_TIM_DisableCounter(TIMx);
LL_TIM_SetPrescaler(TIMx, 7200-1);
LL_TIM_SetAutoReload(TIMx, (uint16_t)((10000/freq))-1);
LL_TIM_OC_SetCompareCH4(TIMx, (uint16_t)((10000/freq)/2))
最近手头项目上有个需要模拟串口的地方,而模拟串口部分有这样的一个需求:当Strat信号来的时候启动定时器TIM3,到52us后采样Start信号是否是低电平,然后希望将定时器的周期改成104us,采样剩余的9个bit。
解决思路:
① 外部中断触发时候启动TIM3(同时关闭外部中断使能),等52us后在TIM3中断里判断Rx的状态;
② 如果是低电平就改变定时器TIM3的周期为104us;
定时器详解时钟源计数器定时器周期计算定时器初始化结构体详解程序设置
定时器(Timer)最基本的功能就是定时了,比如定时发送 USART 数据、定时采集 AD数据等等。如果把定时器与 GPIO 结合起来使用的话可以实现非常丰富的功能,可以测量输入信号的脉冲宽度,可以生产输出波形。定时器生产 PWM 控制电机状态是工业控制普遍方法,这方面知识非常有必要深入了解。
STM32F4xx系列控制器有 2 个高级控制定时器、10 个通用定时器和 2 个基本定时器。
这里通用定时器的时钟频率是由APB1的分频系数决定,如果APB1的预分频系数是1,则通用定时器的时钟频率等于APB1的时钟频率,否则为AP
首先原则上STM32通用定时器的4个通道的频率是一样,是由定时器设定频率决定,各个通道可以设置不同的占空比和开启关闭,这些是相互独立的;
但是利用一些特殊方法可以修改定时器不同通道的频率,方法比较讨巧:就是利用CCR1的自动溢出的中断更改频率,用CCR1的值不断的在增加,设置ARR为65535,而65535的二进制是1111111111111111,超出会溢;如果TIMx_CNT=TIM_CCR...
在STM32的定时器中,预分频器(Prescaler-PSC)用来将定时器时钟源进行分频输出。预分频器的值由寄存器TIMx_PSC设定,是一个16位正整数值。STM32CubeMX中的TIM预分频设置在STM32系统中,定时器的时钟源为内部时钟时,其频率一般都比较高,以STM32F103的TIM1为例,其总线时钟最大为72MHz,体现在16位的定时器上的效果就是从0计数到65535上溢只需要0.9...
1.HSE:High_Speed_Extenal 外部高速时钟,焊接在芯片外部,精确度较高,是系统时钟的主要来源。
2.HSI :High_Speed_Inernal内部高速时钟,在芯片内部,精度不高。
3.LSE:Low_Speed_Extenal外部低速时钟,接频率为32.768kHz的石英晶体。主要为RTC时钟服务。
4.LSI:Low_Speed_Inernal内部低速时钟,提供低功耗时钟,大小为40kHz,主要用于驱动独立看门狗。
2..PWM波形的生成原理
先将GPIO引脚电平拉高、同时启动定时器定T*duty时间,时间到了在isr中将电平拉低,然后定时T*(1-duty)后再次启动定时器,然后时间到了后在isr中将电平拉高
一. TIMER分类:
STM32中一共有11个定时器,其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。
计数器分辨率
计数器类型
预分频系...
调节占空比TIMx_SetCompare(1,0-arr); //TIM x为定时器数字如TIM2、TIM3,参数1位通道,参数2为ccr 此致时间内与电平翻转 比如默认0-arr都为高电平,如setcompare的值为arr/2,就是0-arr/2 ...