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.

[参考译文] MSP430FR5987:ADC12B中断

Guru**** 2609955 points
Other Parts Discussed in Thread: MSP430FR5987

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/660155/msp430fr5987-adc12b-interrupt

部件号:MSP430FR5987

我已在MSP430fr5987上初始化ADC12B,但无法使其生成和中断??? ADC12ENC的单次转换触发。

P9SEL0 |= BIT2; //将WFP 9.2 设置为模拟输入,A10
P9SEL1 || BIT2;

ADC12CTL0 = ADC12ON; // ADC12ENC =0,ADC12SC=0

// REF_A SLAU367L第668页
同时(REFCTL0和REFGENBUSY); //如果ref发生器忙,请等待
REFCTL0 |= REFVSEL_1+REFON; //选择内部参考= 2.0V

//采样和保持时间对于MEM0至MEM32使用16个采样时钟
ADC12CTL0 |= 0x2200; // ADC_SMP_16;

//使用MOD时钟
ADC12CTL1 |= 0x18;//TODO TRY SMCLK ADC_CLK_MOD;

//单通道单转换
ADC12CTL1 |= 0x0; // ADC_SNGL;

//反转单个样本和保持
ADC12CTL1|=0; //不反转

//使用12位分辨率
ADC12CTL2 |= 0x0020; // ADC_12_bit;

// VR+= VREF缓冲(2.0V),VR-= AVSS (0V)
ADC12MCTL0 |= 0x0100; // ADC_REF_VRF;

//INCHx = 10 (A10或DAC VOUTB)
ADC12MCTL0 |= 0x000A; // 10;

ADC12IFGR0 = 0x0000; //清除中断标志
ADC12IFGR1 = 0x0000;
ADC12IFGR2 = 0x0000;

ADC12IER0 = ADC12IE0; //为ADC12MEM0启用中断
ADC12IER1 =0; //禁用MEM16到MEM31的中断
ADC12IER2 =0; //禁用辅助输入的中断

ADC12CTL0 |= 0x0003; // ADCSC =开,ADCENC=开 

---------------------------------------------------------------------------------------------------------------------------------------------------

#pragma vector=ADC12_vector
__interrupt void ADC12 (void){__disable_interrupit();


//禁用任何其他中断

ADC12CTL0 &= 0xFFfc; // ADC12ENC =0,ADC12SC =0

//switch (__偶 数_in_range (ADC12IV,ADC12IV_ADC12RDYIFG))
//{
// Case ADC12IV_none: 中断; //矢量0:无中断
// CASE ADC12IV_ADC12OVIFG:中断; //矢量2:ADC12MEMx溢出
// CASE ADC12IV_ADC12TOVIFG:中断; //矢量4:转换时间溢出
// CASE ADC12IV_ADC12HIIFG:中断; // A1是否> 2V?:高中断
// CASE ADC12IV_ADC12LOIFG:中断; // A1是否< 1V?:低中断
// CASE ADC12IV_ADC12INIFG:中断; //矢量10:ADC12IN
// CASE ADC12IV_ADC12IFG0:
////
中断; //矢量12:ADC12MEM0
////

CASE ADC12IV_ADC12IFG1:中断; //矢量14:ADC12MEM1
// CASE ADC12IV_ADC12IFG2:中断; //矢量16:ADC12MEM2
//案例ADC12IV_ADC12IFG3:

ADC_Capture_Data (ADC_rslt);

// 中断; //矢量18:ADC12MEM3
//案例ADC12IV_ADC12IFG4:中断; //矢量20:ADC12MEM4
// CASE ADC12IV_ADC12IFG5:中断; //矢量22:ADC12MEM5
//案例ADC12IV_ADC12IFG6:中断; //矢量24:ADC12MEM6
//案例ADC12IV_ADC12IFG7:中断; //矢量26:ADC12MEM7
// CASE ADC12IV_ADC12IFG8:中断; //矢量28:ADC12MEM8
//案例ADC12IV_ADC12IFG9:中断; //矢量30:ADC12MEM9
// CASE ADC12IV_ADC12IFG10:中断; //矢量32:ADC12MEM10
//案例ADC12IV_ADC12IFG11:中断; //矢量34:ADC12MEM11
// CASE ADC12IV_ADC12IFG12:中断; //矢量36:ADC12MEM12
//案例ADC12IV_ADC12IFG13:中断; //矢量38:ADC12MEM13
// CASE ADC12IV_ADC12IFG14:中断; //矢量40:ADC12MEM14
// CASE ADC12IV_ADC12IFG15:中断; //矢量42:ADC12MEM15
// CASE ADC12IV_ADC12IFG16:中断; //矢量44:ADC12MEM16
// CASE ADC12IV_ADC12IFG17:中断; //矢量46:ADC12MEM17
//案例ADC12IV_ADC12IFG18:中断; //矢量48:ADC12MEM18
// CASE ADC12IV_ADC12IFG19:中断; //矢量50:ADC12MEM19
//案例ADC12IV_ADC12IFG20:中断; //矢量52:ADC12MEM20
//案例ADC12IV_ADC12IFG21:中断; //矢量54:ADC12MEM21
// CASE ADC12IV_ADC12IFG22:中断; //矢量56:ADC12MEM22
// CASE ADC12IV_ADC12IFG23:中断; //矢量58:ADC12MEM23
//案例ADC12IV_ADC12IFG24:中断; //矢量60:ADC12MEM24
// CASE ADC12IV_ADC12IFG25:中断; //矢量62:ADC12MEM25
// CASE ADC12IV_ADC12IFG26:中断; //矢量64:ADC12MEM26
// CASE ADC12IV_ADC12IFG27:中断; //矢量66:ADC12MEM27
// CASE ADC12IV_ADC12IFG28:中断; //矢量68:ADC12MEM28
// CASE ADC12IV_ADC12IFG29:中断; //矢量70:ADC12MEM29
// CASE ADC12IV_ADC12IFG30:中断; //矢量72:ADC12MEM30
// CASE ADC12IV_ADC12IFG31:中断; //矢量74:ADC12MEM31
// CASE ADC12IV_ADC12RDYIFG:中断; //矢量76:ADC12RDY
//默认值:中断;
//}

ADC12IFGR0 = 0x0000; //清除中断标志
ADC12IFGR1 = 0x0000;
ADC12IFGR2 = 0x0000;

__enable_interrupt (); //重新启用中断

ADC12CTL0 || ADC12ENC | ADC12SC; //开始采样/转换}--><!--kadov_tag{{</spaces>}--><!--kadov_tag{</spaces>}--><!--kadov_tag{</spaces>}-------------




void ADC_Capture_Data (无符号int *data)
{

数据[0]=1;

DATA[1]= ADC12MEM0;
Data[2]= ADC12MEM1;
Data[3]= ADC12MEM2;
Data[4]= ADC12MEM3;
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Gary:
    有一个包含此内容的示例代码称为ADC12_02。 您只需更改信道分配即可。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    下面是代码,让您更轻松:

    #include <MSP430-h>
    
    int main(void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止WDT
    
    // GPIO设置
    P1OUT &=~BIT0; //清除LED以启动
    P1DIR |= BIT0; // WFP 1.0 输出
    P1SEL1 |= BIT1; //为1.1 ADC
    P1SEL0
    
    
    
    ~配置WFP;//禁用GPIO通电默认高阻抗模式以激活//先前配置的端口设置PM5CTL0 &= LOCKLP5;
    
    //默认情况下,REFSTR=1 => REFCTL用于配置内部参考
    同时(REFENL0和REFCTBUSY); //如果ref发生器忙,请等待
    REFCTL0 || REFVSEL_0| REFON; //选择内部参考= 1.2V
    //内部参考打开
    
    //配置ADC12
    ADC12CTL0 = ADC12SHT0_2 | ADC12ON;
    ADC12CTL1 = ADC12SHP; // ADCCLK = MODOSC;采样计时器
    ADC12CTL2 |= ADC12RES_2; // 12位转换结果
    ADC12IER0 |= ADC12IE0; //启用ADC转换完全中断
    ADC12MCTL0 |= ADC12INCH_1 | ADC12VRSEL_1;// A1 ADC输入选择;Vref=1.2V
    
    while (!(REFCTL0和REFGENRDY)); //等待参考发生器
    //在
    
    (1){
    
    __DELAY周期(5000); //转换之间的延迟
    ADC12CTL0 || ADC12ENC | ADC12SC; //开始采样和转换
    
    __bis_sr_register (LPM0_bits + GIE); // LPM0,ADC10_ISR将强制退出
    __no_operation(); //仅用于调试
    }
    }
    
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR(void)
    #Elif defined(__GNUC__)
    void __attribute__((interrupt (ADC12_vector))(#interrupt (vector))
    
    
    #endif
    {
    switch (__偶 数_in_range(ADC12IV, ADC12IV_ADC12RDYIFG)){
    
    案例ADC12IV_NONE: 中断; //矢量0:无中断
    CASE ADC12IV_ADC12OVIFG:中断; //矢量2:ADC12MEMx溢出
    CASE ADC12IV_ADC12TOVIFG:中断; //矢量4:转换时间溢出
    CASE ADC12IV_ADC12HIIFG:中断; //向量6:ADC12BHI
    CASE ADC12IV_ADC12LOIFG:中断; //矢量8:ADC12BLO
    CASE ADC12IV_ADC12INIFG:中断; //矢量10:ADC12BIN
    Case ADC12IV_ADC12IFG0: //向量12:ADC12MEM0中断
    IF (ADC12MEM0 >= 0x6B4) // ADC12MEM = A1 > 0.5V?
    P1OUT |= BIT0; // WFP 1.0 = 1.
    否则
    P1OUT &=~BIT0; // WFP 1.0 = 0
    __BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//退出活动CPU
    中断; //从0 (SR)清除CPUOFF位
    
    CASE ADC12IV_ADC12IFG1:中断; //矢量14:ADC12MEM1
    CASE ADC12IV_ADC12IFG2:中断; //矢量16:ADC12MEM2
    CASE ADC12IV_ADC12IFG3:中断; //向量18:ADC12MEM3
    CASE ADC12IV_ADC12IFG4:中断; //向量20:ADC12MEM4
    CASE ADC12IV_ADC12IFG5:中断; //矢量22:ADC12MEM5
    CASE ADC12IV_ADC12IFG6:Break; //矢量24:ADC12MEM6
    CASE ADC12IV_ADC12IFG7:Break; //矢量26:ADC12MEM7
    CASE ADC12IV_ADC12IFG8:Break; //矢量28:ADC12MEM8
    CASE ADC12IV_ADC12IFG9:Break; //向量30:ADC12MEM9
    CASE ADC12IV_ADC12IFG10:中断; //矢量32:ADC12MEM10
    CASE ADC12IV_ADC12IFG11:Break; //矢量34:ADC12MEM11
    CASE ADC12IV_ADC12IFG12:中断; //矢量36:ADC12MEM12
    CASE ADC12IV_ADC12IFG13:中断; //矢量38:ADC12MEM13
    CASE ADC12IV_ADC12IFG14:Break; //向量40:ADC12MEM14
    CASE ADC12IV_ADC12IFG15:中断; //矢量42:ADC12MEM15
    CASE ADC12IV_ADC12IFG16:Break; //矢量44:ADC12MEM16
    CASE ADC12IV_ADC12IFG17:Break; //矢量46:ADC12MEM17
    CASE ADC12IV_ADC12IFG18:中断; //矢量48:ADC12MEM18
    CASE ADC12IV_ADC12IFG19:中断; //矢量50:ADC12MEM19
    CASE ADC12IV_ADC12IFG20:Break; //矢量52:ADC12MEM20
    CASE ADC12IV_ADC12IFG21:Break; //矢量54:ADC12MEM21
    CASE ADC12IV_ADC12IFG22:中断; //矢量56:ADC12MEM22
    CASE ADC12IV_ADC12IFG23:Break; //矢量58:ADC12MEM23
    CASE ADC12IV_ADC12IFG24:中断; //向量60:ADC12MEM24
    CASE ADC12IV_ADC12IFG25:中断; //矢量62:ADC12MEM25
    CASE ADC12IV_ADC12IFG26:Break; //矢量64:ADC12MEM26
    CASE ADC12IV_ADC12IFG27:Break; //矢量66:ADC12MEM27
    CASE ADC12IV_ADC12IFG28:Break; //矢量68:ADC12MEM28
    CASE ADC12IV_ADC12IFG29:Break; //向量70:ADC12MEM29
    CASE ADC12IV_ADC12IFG30:中断; //矢量72:ADC12MEM30
    CASE ADC12IV_ADC12IFG31:中断; //矢量74:ADC12MEM31
    CASE ADC12IV_ADC12RDYIFG:中断; //矢量76:ADC12RDY
    默认值:break;
    }
    }
    

    尝试此操作,如果不起作用,请告诉我。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢你。 我能看到的唯一区别是您打开了"采样和保持脉冲"模式(ADC12SHP)。 我试图使用ADC12ENC和ACD12SC来开始转换。 Figure 28-8显示了“ADC12MCTLx中定义的示例输入通道”气泡,该气泡在没有SAMPCON上升沿的情况下开始转换。 我意识到我需要一个样品和保持时间来获得准确的读数,但我认为我可以让ADC处理它。 显然不是。 我想我在图28-3&4中看不到什么触发SHI。 因此,我尝试使用所提供的文档来解决这个问题,通常我认为这些文档非常出色。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴能为你提供帮助。 我会记下您的反馈,但是的,ADC有时可能很棘手。