仙景 发表于 2020-11-12 15:44

【AutoChips AC7801x电机demo板测评】+ 电机控制下的PWM不同配置

本帖最后由 仙景 于 2020-11-12 22:41 编辑

<p><strong>序言:</strong>做电机控制的,都知道高级定时器乃是电机控制下的精髓,其中包括互补PWM,PWM带死区输出,还有移向PWM&hellip;&hellip;目前AC7801都包括这些功能,实属功能强大,真是国产MCU崛起的节奏。就不知道价格美不美丽,要是美丽,那就不得了。不过,那&hellip;&hellip;我们不关心,我们关心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>&hellip;&hellip;&hellip;&hellip;</p>

<p>还有很多寄存器就理出来,大家去看,这里做简单说明。</p>

<p><strong>向上计数组合模式:</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;周期=(MCVR-CNTIN+1)*PWM计数器时钟周期,占空比=|CH(n+1)V-CH(n)V|*PWM计数器时钟周期<br />
<strong>向上-向下计数组合模式:</strong><br />
&nbsp; &nbsp; 周期=2*(MCVR-CNTIN)*PWM计数器时钟周期,占空比=2*(|CH(n+1)V-CH(n)V|)*PWM计数器时钟周期</p>

<p>下面我们要配置上图的P0_CH2(PB11),P0_CH3(PB12)。</p>

<p>&nbsp;</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 &gt;&gt; 2;; //通道2n channel值,n为PWM对数编号
combineChConfig.ch2ndValue = MOD_PWM &gt;&gt; 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 &gt;&gt; 2;; //通道2n channel值,n为PWM对数编号
combineChConfig.ch2ndValue = MOD_PWM &gt;&gt; 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 &gt;&gt; 2;; //通道2n channel值,n为PWM对数编号
combineChConfig.ch2ndValue = MOD_PWM &gt;&gt; 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 &gt;&gt; 2;; //通道2n channel值,n为PWM对数编号
combineChConfig.ch2ndValue = MOD_PWM &gt;&gt; 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>&nbsp;</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

仙景 发表于 2020-11-12 15:45

<p>沙发</p>

w494143467 发表于 2020-11-12 22:00

<p>可以啊,示波器都用上了,自己家里买的示波器吗?</p>

freebsder 发表于 2020-11-12 22:31

<p>加油,谢谢分享!</p>

仙景 发表于 2020-11-13 08:55

w494143467 发表于 2020-11-12 22:00
可以啊,示波器都用上了,自己家里买的示波器吗?

<p>没有钱,用公司的</p>

仙景 发表于 2020-11-13 08:55

freebsder 发表于 2020-11-12 22:31
加油,谢谢分享!

<p>请持续关注</p>
页: [1]
查看完整版本: 【AutoChips AC7801x电机demo板测评】+ 电机控制下的PWM不同配置