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 中也有断点、这些断点永远不会被触发。
1) 1)听起来您正在修改更大的代码库。 我想知道其他一些代码是否在使用 TA3。 尝试搜索、例如 TA3CTL。
2)看一下 SLAA577G 中的原理图、我认为您将能够看到 R59低侧 LED4旁边的 P4.7。 (它也会使 LED 闪烁、但速度太快以至于看不到。)
我没意识到在您的平台上访问引脚非常困难。 另一种选择是将 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 */
"50%占空比"观察结果听起来像是在探测 TA3.0 (P4.7)、而不是 TA3.1 (P11.1)。 上面(顶行)的示波器轨迹线适用于 TA3.1。
PWM 在 TA3.1 (P11.1)上。 TA3.0 (P4.7)探针仅用于诊断。
是的、您的权利。 我被他的鸡巴深深地含进了嘴里。 哈哈,我在 P11.1上看不到任何东西,所以昨晚我探测了 P4.7。 我只是将 P11.1设置为数字 I/O、并将其设置为高电平、看不到任何内容、因此需要再次将导线重新转插至芯片。
[附带说明:我 不知道我在下周左右的日程安排。 这里有很多聪明的人可以提供帮助、但您可能会发现您必须启动新的主题来吸引他们的注意力。]
无需担心 Bruce。 我将导线解析为 P11.1、看起来一切现在都正常运行! 等了一分钟。 测量现在看起来也非常稳定。 我需要做一些更多的测试、但我已经测试了5%的占空比、50%和96%的占空比、结果看起来非常好! :)
还有一个问题。 我还需要测量 PWM 信号的低侧、TA3是否有任何东西可以在 PWM 信号的下降沿触发 ADC?
您已经在使用两个 TA3.0边沿(ISSH 技巧就是这么做的)、因此我没有看到另一种触发机制。 使用 TA0.1作为触发器、您可以使用 PWM 的两个边沿(使用 ISSH 技巧、尽管是通过赛跑)、但看起来这不是一个选择。
也许可以使用 DMA 技术(使用 DMA 将一些内容复制到 ADC10CTL0中)、但我不确定 自己能否从头开始设计它。
好的、这是有道理的。
我还需要读取更多的模拟通道。 在某处有一个很好的例子吗?
示例 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
太棒了、感谢您的帮助。 在对多条通道进行采样时、ADC ISR 会消失吗?我只需要使用 DMA ISR、并将下面的代码放入 DMA ISR 中?
ADC10CTL0 &=~ADC10ENC;
ADC10CTL1 ^= ADC10ISSH;//切换 ISSH 以在每个周期提供触发(EQU0)
ADC10CTL0 |= ADC10ENC;
是的、在这种情况下、DMA ISR 会指示完成、所以你需要在那里执行 ADC 任务。