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