This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我正在开发2级电动汽车充电器的代码。 我正在使用三相功率计(TIDM-THREEPHASEMETER-F6779)中的示例代码。
我正在使用计时器2生成 PWM 信号、如下面的代码所示。 我正在尝试以5%的占空比测量 PWM 信号的电压。 下图顶部显示了 PWM 信号、底部显示了一个引脚、我将进行切换以显示 ADC 何时对 PWM 信号进行采样。
为什么 每次计时器到达 TA2CCR0时 TIMER2_A0中断不会触发? 当 PWM 信号从低电平变为高电平时、TIMER2_A0中断是否不应该立即触发?
是否有更好的方法可以测量 PWM 信号的电压?
/*设置初始 PWM 周期1kHz */
TA2CCR0 = 16685 - 1;//32786Hz 时钟除以2、并具有一些失调电压。 -1来自计时器从0开始计数、而不是1。
/* CCR0复位/置位*/
TA2CCTL1 = OUTMOD_7;
TA2CCTL0 = CCIE;// CCR0中断被启用
电流额定值= 5.0;
CURRENT_RA定值= CURRENT_RA定值/ 100.0;
TA2CCR1 = 16685.0 * CURRENT_RA定值;
/* SMCLK、向上计数模式、清除 TAR */
TA2CTL = TASSEL_2 | MC_1 | TACLR | TAIE;
/***** 启用导线 PWM **** /
P11DIR |= BIT3;
P11SEL0 |= BIT3;
P11OUT &=~BIT3;
#pragma vector=TIMER2_A0_vector
__interrupt void Timer2_ISR (空)
{
P9OUT ^= BIT0;//切换引脚
ADC10CTL0 |= ADC10ENC + ADC10SC;
}
感谢您的帮助。
Mike
您的 TIMER2_A1_VECTOR 正在做什么? 我想知道它是否阻止/延迟 CCR0中断。
我不确定"测量 PWM 的电压"是什么意思、因为 PWM 信号是数字的。 您是否对测量占空比感兴趣?
感谢布鲁斯的忏悔。 下面是 Timer2_A1_vector。 不过、我只是将代码从 TIMER2_A0_VECTOR 移到了 TA2IV_TA2IFG 用例、以得到下面的图片。 它看起来稍微好一点、但您可以看到、在某些情况下、P9.0在 PWM 信号为高电平时之外进行转换。 我尝试在 PWM 信号为高电平时读取 PWM 信号的模拟输入来测量电压。
对于电动汽车充电、当插入车载充电器时、电动汽车会将 PWM 信号从3.3V 下拉至2.7V。 当汽车准备好充电时、 PWM 信号会被下拉至2.1V。 该 PWM 信号将传输到模拟输入引脚。 明白了吗? 我正在生成占空比、因此我已经知道占空比是多少。 占空比决定了电动汽车可以从充电器中拉取的电流大小。
// Timer2_A1中断矢量(TAIV)处理程序
#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER2_A1_vector
__interrupt void TIMER2_A1_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (TIMER2_A1_vector)) TIMER2_A1_ISR (void)
#else
#错误编译器不受支持!
#endif
{
开关(__even_in_range (TA2IV、14))
{
TA2IV_NONE:break;//无中断
案例 TA2IV_TA2CCR1:break;// TA0CCR1_CCIFG
情形4:中止;//保留
案例6:break;//保留
案例8:break;//保留
案例10:中断;//保留
案例12:中断;//保留
TA2IV_TA2IFG 案例:
P9OUT ^= BIT0;//切换引脚
ADC10CTL0 |= ADC10ENC + ADC10SC;
break;// TA0IFG
默认值:中断;
}
}
哦、好的、听起来您确实需要测量 PWM 的(高侧)电压。 (我以前没见过。)
由于其他系统活动和进入 ISR 所需的时间、这个新跟踪似乎显示了(或多或少) TAIFG 中断的正常延迟。 (区别在于有抖动、但没有明显的漂移。) 该延迟是 ADC 使用基于软件的启动时的危险之一。
跳到最后:如果可以的话、我建议使用 TA3而不是 TA2。 TA3.0 (即 CCR0)可以通过 ADC10SHS=2 (参考数据表(SLAS768E)表6-20)为 ADC 提供硬件触发、以便您避免所有软件/ISR 延迟。
背景:看起来您的采样/PWM 周期大约为1ms、因此5%的占空比大约为50usec。 即使降低延迟、您仍必须确保 ADC 启动+采样/保持可以在这段时间内完成。 这将考虑 ISR 延迟(最大值)和 ADC10SHT/ADC10SSEL。 这有点紧凑、而可变延迟使其更加困难。 如果您可以使用 ADC10SHS 将延迟减小到0 (最大值)、您只需调整 ADC10SHT/ADC10SSEL (静态)即可在50us 内完成。
是的、我尝试测量 PWM 信号的高侧电压、该高侧电压将在整个汽车充电过程中发生变化。 PWM 信号是1kHz 信号。
我是否可以将该 PWM 信号输入到端口1引脚中并使用上升沿触发 ADC? 或者尝试这样做是否会有太多延迟?
当您说 TA3.0 (即 CCR0)可以为 ADC 提供硬件触发时、ADC 将在 TA3达到 CCR0时自动触发?
所以我不需要做这个 ADC10CTL0 |= ADC10ENC + ADC10SC; 在软件中??
可以。 您将需要将您的 PWM 从 P11.3 (TA2.1)移动到 P11.1 (TA3.1)并设置 ADC10SH=2。 并将您的 TA2配置代码更改为 TA3。 (您不需要 ISR。)
在 ADC10 ISR 中、您将需要在每次转换后切换 ADC10ENC (=0、然后=1)[参考 UG (SLAU208Q)第二27.2.7.1]。
我完全不能通过使用 ADC10SH=2来使 ADC10 ISR 触发。 下面是 Timer3代码和 ADC10 设置代码。 我在 ADC ISR 中放了一个断点、但它从不会触发。
TA3CCR0 = 16685 - 1;//32786Hz 时钟除以2、并具有一些失调电压。 -1来自计时器从0开始计数、而不是1。
/* CCR0复位/置位*/
TA3CCTL1 = OUTMOD_7;
//TA3CCTL0 = CCIE;// CCR0中断被启用
电流额定值= 5.0;
CURRENT_RA定值= CURRENT_RA定值/ 100.0;
TA3CCR1 = 16685.0 * CURRENT_RA定值;
/* SMCLK、向上计数模式、清除 TAR */
TA3CTL = TASSEL_2 | MC_1 | TACLR;//| TAIE;
ADC10CTL0 &=~ADC10ENC;
/*清除挂起的中断以确保 DMA 的触发*/
ADC10IFG = 0;
/* ADC 打开、ADC10等待来自 SD24的触发、采样时间2us 8xADCclk、自动下一个转换 */
ADC10CTL0 = ADC10SHT0 | ADC10ON | ADC10MSC;
//*由 SD24触发,SMCLK/6 = 4MHz,脉冲采样模式*/
ADC10CTL1 = ADC10SHP | ADC10SHS_2 | ADC10DIV_0 | ADC10SSEL_0 | ADC10CONSEQ_0;/*单通道、单次转换*/
/* 10位转换结果*/
ADC10CTL2 |= ADC10RES;
/*启用 ADC 转换完成中断*/
ADC10IE |= ADC10IE0;
/* A3 ADC 输入选择;Vref=AVCC */
ADC10MCTL0 |= ADC10INCH_3 | ADC10SREF_0;
/*启用 ADC10中断*/
//ADC10IE = ADC10IE0 | ADC10OVIE | ADC10TOVIE;
/*启动 ADC 并等待软件启动转换触发器*/
ADC10CTL0 |= ADC10ENC;//+ ADC10SC;
抱歉、我暂时忘记了 TA3.0触发器依赖于 TA3.0信号、而不是 IFG。 CCR0信号实际上只能以一半的频率切换、但诀窍是每次反转触发感应、以便触发每个 CCR0事件。
因此、添加到配置序列中:
> TA3CCTL0 = OUTMOD_4; //在半频率切换;ISSH 反转(请参阅 ISR)提供完整频率
然后、当您在 ISR 中切换 ENC 时:
> ADC10CTL0 &=~ADC10ENC; //根据 UG 部分27.2.7.1切换 ENC
> ADC10CTL1 ^= ADC10ISSH; //切换 ISSH 以在每个周期提供触发(EQU0)
> ADC10CTL0 |= ADC10ENC;
我没有 F6779、但我刚刚使用 TB0.0在 F5529 (ADC12)上完成了该组合。
添加该代码后、ADC10 ISR 仍不会被触发。 现在、我还没有任何用于 TA3的 ISR 代码、不确定这是否重要。 下面是 ADC10 ISR 代码、供您参考。 请告诉我、您是否希望我检查任何 TA3寄存器、或添加断点或任何内容来帮助解决此问题。
ISR (ADC10、ADC10_INTERRUPT)
{
开关(__even_in_range (ADC10IV、ADC10IV_ADC10IFG)
{
案例 ADC10IV_NONE:
中断;
案例 ADC10IV_ADC10OVIFG:
中断;
案例 ADC10IV_ADC10TOVIFG:
中断;
案例 ADC10IV_ADC10HIIFG:
中断;
案例 ADC10IV_ADC10LOIFG:
中断;
案例 ADC10IV_ADC10INIFG:
中断;
案例 ADC10IV_ADC10IFG:
ADC10CTL0 &=~ADC10ENC;
ADC_RESULT = ADC10MEM0;//存储 ADC10通道0结果
ADC10CTL1 ^= ADC10ISSH;//切换 ISSH 以在每个周期提供触发(EQU0)
ADC10CTL0 |= ADC10ENC;
中断;
}
}
通常的怀疑:
1) 1)您是否在某处启用 GIE? (__enable_interrupt())
2) 2)您是否可以监控 TA3.0 (已按照数据表表表6-76配置 P4.7)? 它应该看起来像一个1/2kHz 的方波。
3) 3)如果您暂停程序、它在哪里执行(在某个地方意外产生错误转弯)?
4) 4)在程序启动时、使用调试器将 ADC10MEM0设置为有区别的东西(例如0x123)、然后运行、然后查看它是否发生变化。 这将把触发器- ADC 阶跃与完成-中断阶跃分开。
该代码来自这里的三相电表示例代码、我已针对我的应用进行了修改。 www.ti.com/.../TIDM-THREEPHASEMETER-F6779
1.我搜索的,找不到这个,但 IAR 出于某种原因不搜索所有的文件。 我还将此添加到了代码中、但 ADC ISR 仍未被 TA3触发。
2.我昨天焊接了一根导线到 TA3.1,然后看到它上面的 PWM 信号。 因为我的焊铁很大、我需要很长时间才能做到这一点、并且我不断地在其旁边短接引脚。 如果您愿意、我可以这样做。
3.当我暂停程序时,它看起来很正常。 当我运行并暂停几次时、它不会在一行代码上卡住。
4.我做了这个,但当我暂停程序,这个值永远不会改变。 我在 ADC ISR 中也有断点、这些断点永远不会被触发。
我没意识到在您的平台上访问引脚非常困难。 另一种选择是将 TA0.1 (AD10SHS=1)用于 PWM。 该信号从引脚 P2.1发出、该引脚连接到射频子卡接头之一(RF_CS、引脚 RF2.14)。 这些微型引脚工作起来有点痛苦、但可能不如 MCU 引脚痛。 [编辑:您的程序中是否有使用 TA0的内容?]
我们通过此参考设计制作了自己的自定义功率计电路板、因此很多引脚没有连接到电路板上的任何位置、我们也不使用您提到的射频子卡、LCD 或 LED4。 我们将对已经投产几年的功率计电路板进行修改、使其成为带有集成式功率计的主系统控制器电路板。 希望这有助于澄清问题。
我订购了一台显微镜,因为我浪费了很多时间。 我要将一根导线焊接到 TA3.0、让您知道它是什么样的。
没有任何其他使用 TA3的代码。 我在 将 TA2代码更改为 TA3之前进行了检查。
是的、TA0用于驱动 Σ-Δ ADC 模块以测量用于功耗计算的电压和电流。
我 在 接近 system_setup ()末尾的地方看到了一个"_EINT ()"。
ADC10MEM0没有变化这一事实表明触发的确没有发生。 如果实用的话、我可以将运行的程序发布在 F5529上(只有72行)。 我没有一个 F5系列器件与 ADC10、但 F5系列 ADC10和 ADC12有许多相似之处。
我已将一根导线焊接到 TA3.0 P4.7、但在该引脚上看不到任何内容。
它看起来 TA3正在计数、因为我看到 TA3R 改变。
1) 1) TA3CCTL0是否设置 OUTMOD=4?
> TA3CCTL0 = OUTMOD_4;
2) 2)您是否根据表6-76配置了 P4.7? 再次看,它声称 P4DIR.7是不在乎,但我不相信。
> P4SEL0 |= BIT7; // P4.7作为 PM_TA3.0
> P4DIR |= BIT7; //输出(尽管表6-76中有"无关"的规定)
步骤(2)仅用于诊断-它不影响触发。
[编辑:固定的 CCTL goof]
是的、我配置了 P4.7。 我一开始没有看到任何内容、因此我将其切换为数字引脚、能够将其切换为高电平并查看其工作情况、只是为了验证我已将导线焊接到正确的引脚。 以下是我的当前代码。 很棒您可以编辑回复。 我看到您更改了 TA3CCTL0 = outmod4。
请注意、我没有在 TA3上启用中断、不确定这是否重要。
TA3CCR0 = 16685 - 1;//32786Hz 时钟除以2、并具有一些失调电压。 -1来自计时器从0开始计数、而不是1。
/* CCR0复位/置位*/
TA3CCTL1 = OUTMOD_4;//在半频率切换;ISSH 反转(请参阅 ISR)可以提供完整频率
//TA3CCTL0 = CCIE;// CCR0中断被启用
电流额定值= 5.0;
CURRENT_RA定值= CURRENT_RA定值/ 100.0;
TA3CCR1 = 16685.0 * CURRENT_RA定值;
/* SMCLK、向上计数模式、清除 TAR */
TA3CTL = TASSEL_2 | MC_1 | TACLR;//| TAIE;
/***** 设置 P4.7 TA3.0引脚**** /
P4SEL0 |= BIT7;// PxSEL -外设功能= 1、I/O = 0
P4DIR |= BIT7;// PxDIR -输出= 1、输入= 0
> TA3CCTL1 = OUTMOD_4;//在半频率切换;ISSH 反转(请参阅 ISR)提供完整频率
应为:
> TA3CCTL0 = OUTMOD_4;//在 ADC 的半频率切换;ISSH 反转(请参阅 ISR)提供全频率
> TA3CCTL1 = OUTMOD_7;// PWM 复位/置位
现在 ADC10 ISR 触发!! :)哇!
下面是计时示意图。 顶部是占空比、底部是在 ADC10 ISR 中切换的引脚。 看起来就像每11到15个样本一样、时序关闭、ADC ISR 不会恰好在 PWM 信号的高侧触发、这很奇怪、现在我们使用的是硬件触发器而不是软件触发器。 有办法解决这个问题吗?
ADC ISR 容易受到与早期计时器 ISR 相同延迟的影响、因此在 ISR 中摆动 GPIO 并不是真正确定的。
ADC 是确定性的(提供或采用一个 ADC 时钟(200ns)进行同步):触发后、它将 ADC 时钟(在您的情况下为8个)的采样/保持时间花费 ADC10SHT 节拍(在您的情况下为5MHz)、然后12个 ADC 时钟进行转换、因此约为(8+12)/5=4usec。 您实际上只关心采样/保持、所以关键时刻是在中断触发前12个 ADC 时钟、但这是 ISR 实际执行前的未知时间。
由于确定性的行为,我想你最感兴趣的是频道3最早触发的情况--这会给你一个关于转换所需时间的上限。
通过监控引脚(P1.3、不幸的是它也是 A3)上的 ADC10CLK 可以看到更多细节。 我在 F2系列器件上执行过一次该操作、可以看到运行 ADC 时钟的开始和停止。 (我模糊地记得它在 ADC 完成后继续运行2-3个周期。) 不过我不知道这个实验是否值得这个麻烦。
您是否看到了合适的样本数据? 我仍然想知道您的源阻抗、因为 SHT=1非常短。
我不太确定下面的代码现在发生了什么情况。 现在、我完全无法像以前那样更改 PWM 信号的占空比。 我必须更改 TA3CCR0 和 TA3CCR1的值、以便使 PWM 信号恢复到1kHz、这是电动汽车充电所必需的。 当我尝试将 TA3CCR1更 改为不同的占空比时、它不会改变、它始终卡在50%占空比。 我需要能够在5%到96%的占空比之间改变占空比。
TA3CCR0 = 8350 - 1;
//TA3CCR0 = 16685 - 1;//32786Hz 时钟除以2、并具有一些偏移。 -1来自计时器从0开始计数、而不是1。
/* CCR0复位/置位*/
TA3CCTL0 = OUTMOD_4;//在半频率切换;ISSH 反转(请参阅 ISR)可以提供完整频率
TA3CCTL1 = OUTMOD_7;//在半频率切换;ISSH 反转(请参阅 ISR)可以提供完整频率
额定电流= 95.0;
CURRENT_RA定值= CURRENT_RA定值/ 100.0;
TA3CCR1 = 8350.0 * CURRENT_RA定值;
TA3CTL = TASSEL_2 | MC_1 | TACLR;/* SMCLK、向上计数模式、清除 TAR */
[附带说明:我 不知道我在下周左右的日程安排。 这里有很多聪明的人可以提供帮助、但您可能会发现您必须启动新的主题来吸引他们的注意力。]
无需担心 Bruce。 我将导线解析为 P11.1、看起来一切现在都正常运行! 等了一分钟。 测量现在看起来也非常稳定。 我需要做一些更多的测试、但我已经测试了5%的占空比、50%和96%的占空比、结果看起来非常好! :)
还有一个问题。 我还需要测量 PWM 信号的低侧、TA3是否有任何东西可以在 PWM 信号的下降沿触发 ADC?
示例 MSP430F677x_ADC10_10.c 将从 A2向下采样至 A0。 当 CONSEQ=1时、采样从英寸下降到 A0。 该示例使用 DMA、因为否则样本(通常)到达得太快、ADC ISR 无法及时收集它们。
https://dev.ti.com/tirex/explore/node?node=A__AJYbjTaJ3i6izwfAKTplkg__msp430ware__IOGqZri__LATEST
是的、在这种情况下、DMA ISR 会指示完成、所以你需要在那里执行 ADC 任务。