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.

[参考译文] MSP430F5638:ADC12_A -如何设置 ADC12IV?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/922024/msp430f5638-adc12_a---how-do-you-set-adc12iv

器件型号:MSP430F5638

使用 CCSv10、为5529 Launch Pad 下载了四个 ADC 示例、它们(ADC_01、ADC_06、ADC_07、ADC_10) 在 LP 上都可以正常工作。

已复制 ADC_06并使用5638为我的定制 SBC 修改它。 我使用的是 MEM10、11、12和13、按顺序转换、 并希望为来自 MEM13的中断提供服务。

我无法通过设置 ADC12IE 将 ADC12IV 设置为大小写32。 如果我设置 ADC12IE = 0x001F、它与情况6匹配并在其下运行代码(切换 P8.4位)。 但我希望它与案例32匹配并处理来自这些通道的数据。 ADC12IE 的设置与 ADC12IV 的值之间似乎没有逻辑关系。

我缺少什么?

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

    您实际上使用的是 MEM10-13还是(仅限) INCH_10-13?  

    如果前者:您是否还将 ADC12CSTARTADD=10设置为从 MEM10开始? 它在 MEM0上中断这一事实表明您没有。

    如果是后者:IEn 编号与 MCTLn 编号绑定、而不是 INCH_m 编号。 如果您更改的只是英寸常量、您仍在使用 MCTL0-3。 与 原始示例一样、MCTL3使用 ADC12IE3=0x08 (ADC12IV=0x0C)。

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

    感谢 Bruce、

    这就是问题所在、现在运行正常。 但我不能离开 ISR、即使在索引计数器测试中有显式返回或中断、它也会保持循环。

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

    这可能是一种幻想。 主函数写入 LPM、永远不会唤醒、因此唯一的活动是 ISR 中的活动。 您使用的是 CONSEQ=3和 MSC=1、因此转换连续(永久)运行。

    在 SHT0=8 (256个 ADCCLK)的情况下使用 MEM0-3、您将得到一个大约每4 /(5MHz/256)=~200 uec 的新批次、如果您尝试使用调试器观察它、该批次已经非常快了。

    如果您切换到 MEM10-13 并且没有设置 SHT1=8 (即左侧 SHT1=0)、这将会更加频繁:4/((5MHz/4)=~3usec。 当 MCLK = 1MHz 时、ISR 永远不会退出。

    您发布代码可能会有所帮助、因此我们不会猜测太多内容。 (不要忘记代码标签(" "按钮)。)

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

    感谢您的输入。 将代码转换为使用模式01正在工作的单个通道序列。 我需要对4个通道进行采样、但我要进行过采样和平均值计算。 因此、尝试在循环中调用 ISR、但它只会第一次通过循环并成功捕获第一组4个通道。 请参阅代码。

    // ADC12-02.c
    //此文件使用模式01单序列通道
    //在 ADC12CTL1 - ADC12CONSEQx -位2-1
    
    #include 中设置的 ADC 转换序列模式 
    
    #define MAX_CHANNELS 4. //要转换
    的 ADC 通道数#define MAX_COUNT 2. //要过采样和平均的 ADC 转换数
    
    //每个循环10行4通道转换的2D 数组
    // ISR 与连续通道一起工作,必须按此2D 顺序
    //每个 ISR 运行处理4个通道
    的 volatile unsigned int adc_results[MAX_COUNT][MAX_CHANNELS];
    volatile unsigned int i;
    
    int main (void)
    {
    WDTCTL = WDTPW+WDTHOLD; //停止看门狗计时器
    
    P7SEL |= BIT4 + BIT5;
    
    //我将切换一个位以使用示波器进行查看
    P8OUT = 0x00;
    P8DIR |= 0x10; SPI1引脚1上的// P8.4输出、用于切换
    
    ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT1_8;
    // 1111 11.
    // MSB 5432 1098 7654 3210 lsb
    // 0000 0000 0001 0000 = 0x0010 ADC12ON 打开 ADC12
    // 0000 0000 1000 0000 = 0x0080 ADC12MSC 可实现多采样转换
    // 1000 0000 0000 0000 0000 = 0x8000 ADC12SHT1_8为了避免溢出(8*0x1000u)= 8000、将 SHT1x 用于 MEM8-MEM15
    // --------------------
    // 1000 0000 1001 0000 = 0x8090 总计= ADC12CTL0位设置
    
    ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12CSTARTADD_10;
    // 1111 11.
    // MSB 5432 1098 7654 3210 lsb
    // 0000 0010 0000 0000 = 0x0200 ADC12SHP 采样保持脉冲模式= ADC12MEM8至15和0至7的16个时钟周期
    // 0000 0000 0000 0010 = 0x0002 ADC12CONSEQ_1转换序列选择:1 (1*2U)= 2
    // 1010 0000 0000 0000 0000 = 0xA000 ADC12CSTARTADD_10设置转换开始地址= 1010b = Ah = ADC12MEM10
    // --------------------
    // 1010 0010 0000 0010 = 0xA202 Total = ADC12CTL1位设置
    
    //设置 ADC12MCTLx 存储器控制= ADC12INCH_xx 输入通道
    // ADC12EOS 设置顺序通道转换的结束、在最后一个通道上设置
    默认情况下// ref+= AVCC、默认情况下 ref-= Avss
    ADC12MCTL10 = ADC12INCH_10; // ref+=AVcc、channel = A10
    ADC12MCTL11 = ADC12INCH_11; // ref+=AVcc、channel = A11
    ADC12MCTL12 = ADC12INCH_12; // ref+=AVcc、channel = A12
    ADC12MCTL13 = ADC12INCH_13 + ADC12EOS;// ref+=AVcc、channel = A13、end seq
    
    ADC12IE = 0x2000; //对于 MEM13、ADC12IV = 32d = 20h
    // 1111 11.
    // MSB 5432 1098 7654 3210 lsb
    // 0010 0000 0000 0000 = 0x2000 启用中断 ADC12IFG13
    
    ADC12CTL0 |= ADC12ENC; //启用转换
    ADC12CTL0 |= ADC12SC; //开始转换-软件触发
    
    //循环并运行 ISR MAX_COUNT 时间
    for (i=0;i < MAX_COUNT;i++)
    {
    //使用 LPM0和 LPM4_BITS 进行测试
    _bis_SR_register (LPM4_bits + GIE); //输入 LPM0、启用中断
    __no_operation(); //对于调试器
    }
    }
    
    #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_)
    #pragma vector=ADC12_vector
    __interrupt void ADC12ISR (void)
    #elif defined (__GNU__)
    void __attribute__((interrupt (ADC12_vector)))) ADC12ISR (void
    
    编译器#error!
    #endif
    {
    //对 ADC12IV 进行分析并处理单个、正确的中断矢量、对序列使用最后一个通道
    //第二个参数是范围、 十进制中的用例值
    //用十进制的用例,中断矢量使用十六进制
    //示例仅转到 ADC12IFG14的用例34,在此处更正
    switch (__evo_in_range (ADC12IV,34)
    {
    用例0:break; //向量0:无中断
    情况2:中断; //向量2:ADC 溢出
    情况4:中断; //向量4:ADC 时序溢出
    情况6:中断; //向量6:ADC12IFG0
    情况8:中断; //向量8:ADC12IFG1
    大小写10:break; //向量10:ADC12IFG2
    大小写12:break; //向量12:ADC12IFG3
    case 14:break; //向量14:ADC12IFG4
    情况16:中断; //向量16:ADC12IFG5
    情况18:中断; //向量18:ADC12IFG6
    案例20:中断; //向量20:ADC12IFG7
    case 22:break; //向量22:ADC12IFG8
    case 24:break; //向量24:ADC12IFG9
    大小写26:break; //向量26:ADC12IFG10
    case 28:break; //向量28:ADC12IFG11
    case 30:break; //向量30:ADC12IFG12
    大小写32: //向量32:ADC12IFG13 -对序列中的最后一个通道使用中断情况
    ADC_Results[I][0]= ADC12MEM10; //移动 A10结果,IFG 被清除
    ADC_Results[i][1]= ADC12MEM11; //移动 A11结果,IFG 被清除
    ADC_Results[I][2]= ADC12MEM12; //移动 A12结果,IFG 被清除
    ADC_Results[I][3]= ADC12MEM13; //移动 A13结果,IFG 被清除
    
    //根据电压切换位的代码
    IF (ADC12MEM11 >= 0x00F) // ADC12MEM = A11 > 0.5AVcc? = 1.65V 十进制计数= 2048
    P8OUT |= BIT4; // P8.4 = 1
    其他
    P8OUT &=~BIT4; // P8.4 = 0
    
    _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出活动 CPU,在此处设置断点
    中断;
    案例34:中断; //向量34:ADC12IFG14
    case 36:break; //向量36:ADC12IFG15
    默认值:break;
    }
    
    

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

    我很高兴您能正常工作。

    我无法判断这里是否有问题。 如果您在 for 循环(LPM 行之前)内移动"ADC12CTL0 |= ADC12SC;"、我希望您将填充您的所有行。

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

    它正在工作、还必须清除它、谢谢