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.

[参考译文] MSP430F2012:计时器每秒关闭一次 A/D 每5秒关闭一次???

Guru**** 664280 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/926058/msp430f2012-timer-goes-off-every-second-a-d-goes-off-every-5-seconds

器件型号:MSP430F2012

有人能不能给我必须要做的事情下个灯...下面是代码... pwrDetect = 1 ...我正在使用示波器来监控 LED 和 A/D 输入(在采样时、我可以在此引脚上看到电压下降)。  在 TIMERA0_Vector 中的任何情况下、如果我移除了...LPM3行、我似乎每5秒看到一次样本、如果我在该行中有一个样本、那么我每2秒得到一次样本??  有人能不能告诉我为什么我每秒都得不到样片… 我的 A/D 时钟频率为1MHz、采样周期为/64。  该计时器脱离 VLO 时钟运行、在引脚上测量 VLO 时、我设置了大约1秒的周期。


#include 
#include "Lipo.h"

volatile unsigned int ledSw = 0;
volatile unsigned int pwrDetect = 0;
unsigned int startup = 1;
volatile unsigned int * pBattVolt;

void main (void)
{
结构 PWM_F201x PWM;

mcuwatchdogOff;
MCU_clk_setup;
CONFIGIO;

ad_Config();
pBattVolt =&ADC10MEM;

PWM.PERIOD = 11600;PWM.OnTime = 9400;PWM.MODE = RESET;PWM.CYCLE = UP;
PWM_CONFIG (&PWM);
TACCTL0 |= CCIE;
ADC10CTL0 |= ENC + ADC10SC;


while (1){
_bis_SR_register (LPM3_bits + GIE);
//将 PWM 设置为闪存或不取决于抛出的开关
如果(pwrDetect = 1){//电源连接的 LED 脱离计时器工作
P1OUT &=~(BIT2 | BIT6);//LED 关闭
P1OUT |= BIT7;//MOSFET 导通

//根据模拟电压,P1SEL 将选择哪个 LED 闪烁的计时器
//*********
if (* pBattVolt < red_limit){
P1SEL =((P1SEL 和~黄色)|红色);
}
否则、如果(* pBattVolt > green_limit_CHG){
P1SEL =((P1SEL 和~黄色)|绿色);
}
否则{
P1SEL |=黄色;
}
TACCTL1 = OUTMOD_3;
}
否则{//电源未连接 LED 关闭开关而不是计时器
P1OUT &=~BIT4;//MOSFET 关闭
if ((ledSw)==1){//led 开关被抛出
P1SEL = 0;
if (* pBattVolt < red_limit){
P1OUT &=~黄色;
P1OUT |=红色;
}
否则、如果(* pBattVolt > green_limit){
P1OUT &=~黄色;
P1OUT |=绿色;
}
否则{
P1OUT |=黄色;
}
TACCTL1 = OUTMOD_1;
}
否则、如果((P1IN & BIT0)= 0){
P1OUT &=~(BIT6 | BIT2);
P1SEL = 0;
}
}

}

#pragma vector=TIMERA0_vector
__interrupt void PWM_Output_Control (void)
{
ADC10CTL0 |= ENC + REFON + ADC10ON + ADC10SC;//针对采样的//ARM ADC
//__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//唤醒并运行 main!
}

#pragma vector=ADC10_Vector
__interrupt void BatteryVoltage (void)
{
ADC10CTL0 &=~(ENC + REFON + ADC10ON);//禁用 ADC
*pBattVolt = ADC10MEM;
if (启动){
P1IFG |= BIT5;//强制中断获取电源状态
P1IFG |= BIT0;//强制中断以获取 LED 开关
}
__BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//唤醒并运行 main!
}

#pragma vector=Port1_vector
__interrupt void LED_Switch (void)
{
IF (P1IFG & BIT0){
ledSw = P1IN 和 BIT0;
P1IFG &=~BIT0;
P1IES ^= BIT0;
}
IF (P1IFG & BIT5){
pwrDetect =(P1IN & BIT5)>> 5;
P1IFG &=~BIT4;
P1IES ^= BIT5;
}
启动= 0;
_BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);//唤醒并运行 main!
}

函数定义

void ad_Config (void)//定义
{
ADC10CTL0 = SREF_1 + REF2_5V + ADC10SHT_3 + REFON + ADC10IE + ADC10ON;
ADC10CTL1 = INCH_1 + SHS_0 + ADC10DIV_0 + ADC10SSEL_2;//通道1、clk (3.7MHz - 6.3MHz)、将 clk 除以8以保证用 HiZ 输入、TA1源 S/H 建立
ADC10AE0 = BIT1;
}

void PWM_CONFIG (struct PWM_F201x* p)//定义
{
TACCR0 =(p ->周期); //周期(以秒为单位
TACCR1 =(p -> OnTime); //以秒为单位的导通时间
如果(p -> MODE = NORMAL)
TACCTL1 |= OUTMOD_3;
否则、如果(p -> MODE =反相)
TACCTL1 |= OUTMOD_7;
否则、如果(p -> MODE = RESET)
TACCTL1 |= OUTMOD_5;
其他
TACCTL1 |= OUTMOD_3;

如果(p -> cycle = up)
TACTL |= MC_1;
其他
TACTL |= MC_2;

TACTL |= tassel_1;
}


BCSCTL3 |= 0x20; BCSCTL1 = CALBC1_1MHz; DCOCTL = CALDCO_1MHz;

谢谢 

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Steve、

    [引用 USER="Steve Wenner"]在 TIMERA0_Vector 中的任何事件中,如果我删除了...LPM3行,我似乎每5秒就会看到一次样本,如果我在该行中,我每2秒就会得到一次样本??

    在 LPM3线路出现时、您会唤醒 CPU 并在 Timer_A ISR 之后立即执行 while (1)语句中的代码。 如果 pwrDetect = 1、那么您可以通过将 TACCTL1从 OUTMOD_5 (RESET)修改为 OUTMOD_3 (SET/RESET)来更改计时器模式。

    没有它、您就不会唤醒、直到稍后才执行该代码、并保持相同的模式。 因此、下一个中断发生所需的时间比上一种情况要长。

    此外、我还想指出 《MSP430x2xx 系列用户指南》第358页顶部的注释。

    为了避免错误的运行条件、建议在修改定时器的运行(中断使能、和中断标志除外)之前停止定时器。 当定时器时钟与 CPU 时钟异步时、任何对 TAR 的读取应该在定时器未运行时发生、或者结果可能是不可预知的。 或者、定时器在运行时可被多次读取、并且在软件中进行多数表决以确定正确的读取。 对 TAR 的任何写入都将立即生效。

    此致、

    James

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好 James。。。

    我不确定你的意思是什么?...我在到达 while 循环之前进行 ENC (ADC10SC)转换...在处理 AD 后我唤醒、然后计时器中断将关闭并重新启用 AD 转换器...计时器在 VLO 上运行 (一个非常慢的时钟)。。。对于采样+ 13 * 1MHz 的转换、A/D 的时钟频率为1MHz/64。。 我已经放置了断点并且 OUTMODE_3被正确设置并且不会改变(除了从代码开始和 OUTMODE_5开始)……

    我认为问题在于我的计时器 IRQ....在与 ENC 和 ADC10SC 相同的命令中启用 Ref 和 AD。  在基准不稳定的情况下、我基本上使用30us 的采样时间

    我真的不明白如何在 TIMER_A0 IRQ 之后不唤醒来移动到5秒?  我处于 MC_1 (向上计数模式、每次我滚动)

    谢谢

    Steve

    请注意...当我运行以下代码行时:

    ADC10CTL0 |=(ENC + ADC10SC);
    

    在 while 环路之前、我会在 ADCMEM 中自动获取转换、而无需跳转到 ADC ISR?  这是怎么可能发生的?   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADC 设置为使用 MCLK、但在 LPM3中不运行。 这意味着 ADC 仅在 ISR 运行时获取时钟。

    某些 MSP430具有时钟请求系统、如果外设正在使用时钟、则无论低功耗模式如何、该系统都将保持时钟运行。 也许您应该使用 ADC10OSC。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大卫... 
    是的,我在数据表中看到以下粗略代码正常工作...您能解释一下吗? 请注意...我在 LPM3中并使用 MCLK 作为转换器...我有
    一个大阻抗并且需要一个80us 的稳定时间、所以我不相信 ADC10OSC (5MHz)会将它削减(最好是/64分频器)....。

    #include #include "libo.h" volatile unsigned int * pBattVolt; int main (void) { WDTCTL = WDTPW + WDTHOLD; //停止 WDT pBattVolt =&ADC10MEM; BCSCTL3 |= 0x20;BCSCTL1 = CALBC1_1MHz;DCOCTL = CALDCO_1MHz; P1DIR |= BIT6; //p1.6至 TA1 P1SEL |= BIT6; TACCR0 = 500; TACCR1 = 400; TACCTL1 = OUTMOD_3; TACTL |= tassel_1 | MC_1; TACCTL0 |= CCIE; TACCTL1 |= CCIE; ADC10CTL0 = SRHT_1 + ADC10REF_0 + ADC10+ ADC10INCH + ADC10+ ADC10REF_0 + ADC10_INCH + ADC10+ ADC100 + ADC10+ ADC10+ ADC10+ ADC10+ ADC10+ ADC10INCH + ADC10+ ADC10+ ADC10_0 + ADC10+ ADC10+ ADC10+ ADC10+ ADC10+ ADC10+ ADC10 ADC10AE0 |= 0x02; while (1) { _bis_SR_register (LPM3_bits + GIE); if (* pBattVolt > 793) TACCTL1 |=(TACCTL1 &~0x00E0)| OUTMOD_3; 其他 TACCTL1 |=(TACCTL1 &~0x00E0)| OUTMOD_5; } #pragma vector=TIMERA0_vector __interrupt void takea_D (void) { ADC10CTL0 |= ENC + ADC10SC; } #pragma vector=TIMERA1_vector __interrupt void EnableA_D (void) { 开关(TAIV) { 案例2: ADC10CTL0 |= REFON + ADC10ON; 中断; 案例4:中断; 案例10:中断; 默认值:break; } } #pragma vector=ADC10_Vector __interrupt void ADC10_ISR (void) { __BIC_SR_REGISTER_ON_EXIT (LPM3_BITS); }

    … 一个后续的… 我在这里并不完全确定、但以上内容有效。
    我已经重游了你的建议(顺便说一下),然后除以5,它正在工作...我还能够禁用 ADC ISR 内的基准和 ADC,这是一个很好的消息(使用 MCLK 和之前的版本)
    会出现重影、ISR 并不总是会被命中)! 我在这里唯一的担心可能是
    稳定性、但我想我可以忍受它。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    6.3MHz/8、然后64个时钟的采样应超过80us。 最坏情况。