打印
[开发板]

CW32L010+定时器

[复制链接]
88|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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);   
}

七、输出





使用特权

评论回复
沙发
LOVEEVER| | 2024-12-11 17:22 | 只看该作者
芯源的低功耗定时器专为低功耗应用而设计,能够在保持低功耗的同时实现定时功能。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

171

主题

666

帖子

4

粉丝