本帖最后由 meiyaolei 于 2024-12-11 09:57 编辑
这一篇介绍一下定时器的内容,从了解CW定时器到功能实现。
一、定时器类型 CW32L010系列MCU配备了多种类型的定时器,包括:
通用和基本定时器:四组,提供基本的定时和计数功能。 低功耗定时器:一组,专为低功耗应用而设计,能够在保持低功耗的同时实现定时功能。 高级控制PWM定时器:一组,支持PWM输出和高级控制功能,适用于需要精确控制的应用场景。
二、定时器结构与工作原理 CW32L010的定时器主要由以下几个部分组成:
计数器:定时器的核心组件,通常是一个16位或32位的递增计数器。计数器在时钟信号的驱动下递增,直到达到预设的自动重载值(ARR)时溢出,并触发相应的更新事件。 预分频器:用于对时钟信号进行分频,以降低计数器的计数频率。通过预分频器,可以实现更长的定时周期和更细粒度的定时控制。 控制寄存器:用于配置定时器的工作模式、预分频系数、自动重载值等参数。 输出比较寄存器:用于设置定时器的输出比较值,当计数器的值达到该值时,定时器将触发相应的输出事件。
三、定时器功能与应用 CW32L010的定时器具有多种功能,可以应用于多个领域:
定时控制:通过配置定时器的计数周期和预分频系数,可以实现精确的定时控制。例如,在闹钟应用中,可以使用定时器来设置闹钟的响铃时间。 PWM输出:高级控制PWM定时器支持PWM输出功能,通过改变分频比和占空比,可以调节PWM信号的频率和幅值。PWM信号广泛应用于电机控制、LED调光等领域。 频率测量:定时器还可以用于频率测量,将未知频率的信号作为输入,通过测量计数器的计数次数来计算输入信号的频率。 捕获/比较功能:定时器支持捕获/比较功能,可以捕获外部信号的边沿或比较内部计数器的值与预设值,从而触发相应的中断或输出事件。
四、定时器配置与使用 在使用CW32L010的定时器时,需要进行以下配置:
选择定时器类型:根据应用需求选择合适的定时器类型(通用和基本定时器、低功耗定时器或高级控制PWM定时器)。 配置计数器参数:设置计数器的计数周期、预分频系数等参数。 配置输出比较寄存器:如果需要输出比较功能,需要设置输出比较寄存器的值。 启用定时器:通过配置控制寄存器启用定时器,并开始计数。
介绍一下高级定时器的特性:
16bit递增、递减和递增/递减自动重载计数器 可编程预分频器支持1、2、3、4、…、65536分频 支持单次计数模式和连续计数模式 6路独立输入捕获和输出比较通道 死区时间可编程的互补PWM输出 支持双点比较移相,支持逻辑与移相 支持2个刹车输入 触发输入信号(TRGI)控制定时器实现多种从模式 定时器级联ITR和片内外设互联ETR 支持针对定位的增量(正交)编码器和霍尔传感器电路 多种事件发生时产生中断请求:‒ 更新事件‒ 触发事件‒ 输入捕获‒ 输出比较‒ 换向事件‒ 刹车事件‒ 编码器事
五、定时器框架与时序 时序图 预分频器对CK_PSC时钟进行分频,得到计数时钟CK_CNT,以驱动计数器计数。分频系数通过ATIM_PSC寄存器进行设置,支持1、2、3、4、…、65536分频。ATIM_PSC 寄存器具有缓冲功能,可在运行中修改,新的预分频值将在下一个更新事件发生时生效。
六、代码 void ATIM_Configuration(void)
{
ATIM_InitTypeDef ATIM_InitStruct = {DISABLE,0};
ATIM_OCInitTypeDef ATIM_OCInitStruct = {0};
// 对ATIM进行计数的基本设置
ATIM_InitStruct.BufferState = DISABLE; //不启用ARR的缓存功能
ATIM_InitStruct.CounterAlignedMode = ATIM_COUNT_ALIGN_MODE_CENTER_BOTH; //
ATIM_InitStruct.CounterDirection = ATIM_COUNTING_UP;
ATIM_InitStruct.CounterOPMode = ATIM_OP_MODE_REPETITIVE;
ATIM_InitStruct.Prescaler = 7; //8分频,计数时钟1MHz
ATIM_InitStruct.ReloadValue = 99; // 溢出周期100us
ATIM_InitStruct.RepetitionCounter = 0;
ATIM_Init(&ATIM_InitStruct);
ATIM_OCInitStruct.BufferState = DISABLE;
ATIM_OCInitStruct.OCComplement = ENABLE;
ATIM_OCInitStruct.OCFastMode = DISABLE;
ATIM_OCInitStruct.OCInterruptState = ENABLE;
ATIM_OCInitStruct.OCMode = ATIM_OCMODE_PWM1;
ATIM_OCInitStruct.OCPolarity = ATIM_OCPOLARITY_NONINVERT;
ATIM_OC1Init(&ATIM_OCInitStruct);
// ATIM_ITConfig(ATIM_IT_UIE, ENABLE);
ATIM_SetCompare1(50-1);
ATIM_SetPWMDeadtime(20, 40, ENABLE); // 前死区为20个单位,后死区为40个单位,死区计算见用户手册
ATIM_CH1Config(ENABLE);
ATIM_CtrlPWMOutputs(ENABLE);
ATIM_Cmd(ENABLE);
}
七、输出
|