【AutoChips AC7801x电机demo板测评】+ 电机控制下的PWM不同配置
[复制链接]
本帖最后由 仙景 于 2020-11-12 22:41 编辑
序言:做电机控制的,都知道高级定时器乃是电机控制下的精髓,其中包括互补PWM,PWM带死区输出,还有移向PWM……目前AC7801都包括这些功能,实属功能强大,真是国产MCU崛起的节奏。就不知道价格美不美丽,要是美丽,那就不得了。不过,那……我们不关心,我们关心PWM不同配置。
特性与结构:PWM 每通道使用一个输入/输出(I / O)引脚、 CHn(PWM 通道(n)),其中 n 是通道编号(0-7)。PWM 的核心部分为 16 位计数器,具有可编程的初始值和最终值,其计数可以是向上或向上-向下。
下图为 PWM 结构图。
这里有几个关键的寄存器:
初始化寄存器(PWM_INIT)
配置时钟,配置分频器,计数模式,还有溢出中断。
计数器寄存器(PWM_CNT)
15:0位:CNT 寄存器包含 PWM 计数器值。 Reset 清除 CNT 寄存器。将任何值写入 COUNT 都会使用其初始值 CNTIN 更新计数器。
最大计数值寄存器(PWM_MCVR)
15:0位:MCVR 寄存器包含 PWM 计数器的模数值。当 PWM 计数值达到 MCVR 值后, 溢出标志 (CNTOF)在下一个时钟置起,计数器的下一个值取决于所选的计数方法。写入 MCVR 寄存器会将值锁存到缓冲区中。根据从写缓冲区更新的寄存器, MCVR 寄存器使用其写缓冲区的值进行更新。在写入MCVR 寄存器之前,通过写入 CNT 来初始化 PWM 计数器。
通道值寄存器(PWM_CHnV)
15:0位:这些寄存器包含输入模式的捕获 PWM 计数器值或输出模式的匹配值。在输入捕获、捕获测试和双边沿捕获模式下,忽略对 CHnV 寄存器的任何写入操作。在输出模式下,写入 CHnV 寄存器会将值锁存在缓冲区中。根据从写缓冲区更新的寄存器,使用其写缓冲区的值更新 CHnV 寄存器。
…………
还有很多寄存器就理出来,大家去看,这里做简单说明。
向上计数组合模式:
周期=(MCVR-CNTIN+1)*PWM计数器时钟周期,占空比=|CH(n+1)V-CH(n)V|*PWM计数器时钟周期
向上-向下计数组合模式:
周期=2*(MCVR-CNTIN)*PWM计数器时钟周期,占空比=2*(|CH(n+1)V-CH(n)V|)*PWM计数器时钟周期
下面我们要配置上图的P0_CH2(PB11),P0_CH3(PB12)。
互补输出:1、上下通道,高有效
combineChConfig[0].pairChannel = PWM_CH_2; //PWM通道对数,PWM_CH_0/2/4/6对应PAIR0/1/2/3
combineChConfig[0].ch1stValue = MOD_PWM >> 2;; //通道2n channel值,n为PWM对数编号
combineChConfig[0].ch2ndValue = MOD_PWM >> 1;; //通道2n+1 channel值,n为PWM对数编号
#if 1
combineChConfig[0].levelMode = PWM_HIGH_TRUE; //输出PWM高有效,如果占空比设为25%,是指的高有效电平占比25%
#endif
combineChConfig[0].deadtimeEn = DISABLE;//死区插入去能
combineChConfig[0].complementEn = ENABLE;//互补模式使能,使能后,PWM通道波形互补,DISABLE波形输出同向
combineChConfig[0].ch1stMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch2ndMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch1stPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
combineChConfig[0].ch2ndPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
该PWM模式配置出现的波形如下
2、上下通道,低有效
combineChConfig[0].pairChannel = PWM_CH_2; //PWM通道对数,PWM_CH_0/2/4/6对应PAIR0/1/2/3
combineChConfig[0].ch1stValue = MOD_PWM >> 2;; //通道2n channel值,n为PWM对数编号
combineChConfig[0].ch2ndValue = MOD_PWM >> 1;; //通道2n+1 channel值,n为PWM对数编号
#if 1
combineChConfig[0].levelMode = PWM_LOW_TRUE; //输出PWM低有效,如果占空比设为25%,是指的低有效电平占比25%
#endif
combineChConfig[0].deadtimeEn = DISABLE;//死区插入去能
combineChConfig[0].complementEn = ENABLE;//互补模式使能,使能后,PWM通道波形互补,DISABLE波形输出同向
combineChConfig[0].ch1stMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch2ndMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch1stPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
combineChConfig[0].ch2ndPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
该PWM模式配置出现的波形如下
非互补模式:3、上下通道,高有效(同向输出)
combineChConfig[0].pairChannel = PWM_CH_2; //PWM通道对数,PWM_CH_0/2/4/6对应PAIR0/1/2/3
combineChConfig[0].ch1stValue = MOD_PWM >> 2;; //通道2n channel值,n为PWM对数编号
combineChConfig[0].ch2ndValue = MOD_PWM >> 1;; //通道2n+1 channel值,n为PWM对数编号
#if 1
combineChConfig[0].levelMode = PWM_HIGH_TRUE; //输出PWM高有效,如果占空比设为25%,是指的高有效电平占比25%
#endif
combineChConfig[0].deadtimeEn = DISABLE;//死区插入去能
combineChConfig[0].complementEn = DISABLE;//互补模式去使能,DISABLE波形输出同向
combineChConfig[0].ch1stMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch2ndMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch1stPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
combineChConfig[0].ch2ndPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
该PWM模式配置出现的波形如下
4、上下通道,低有效(同向输出)
combineChConfig[0].pairChannel = PWM_CH_2; //PWM通道对数,PWM_CH_0/2/4/6对应PAIR0/1/2/3
combineChConfig[0].ch1stValue = MOD_PWM >> 2;; //通道2n channel值,n为PWM对数编号
combineChConfig[0].ch2ndValue = MOD_PWM >> 1;; //通道2n+1 channel值,n为PWM对数编号
#if 1
combineChConfig[0].levelMode = PWM_LOW_TRUE; //输出PWM低有效,如果占空比设为25%,是指的低有效电平占比25%
#endif
combineChConfig[0].deadtimeEn = DISABLE;//死区插入去能
combineChConfig[0].complementEn = DISABLE;//互补模式去使能,DISABLE波形输出同向
combineChConfig[0].ch1stMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch2ndMatchDir = PWM_MATCH_DIR_DOWN;//仅在向上-向下计数(countMode为PWM_UP_DOWN_COUNT)组合模式有效,用于选择匹配生效点方向
combineChConfig[0].ch1stPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
combineChConfig[0].ch2ndPolarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;//输出极性高有效,PWM mask后PWM输出低电平
该PWM模式配置出现的波形如下
写了四种模式,究竟要使用那种模式,结合自己的项目,看自己的预驱选型是啥。
最后,附上工程代码
PWM.zip
(2.11 MB, 下载次数: 23)
|