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.

[参考译文] MSP430I2040:ADC 编程

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/673912/msp430i2040-adc-programming

器件型号:MSP430I2040

您好!

我正在研究 EVM430I2040S、它上面有 msp430i2040。 我使用的是 ADC 的三个通道。 一个用于电压采样、一个用于电流采样、另一个用于温度采样。 电压和电流样本通过 UART 端子发送到 PC。 所需的采样率为2KHz。 使用的波特率为115200。 我在输入通道上施加了正弦输入、但我没有获得正弦输出。 我认为存在欠采样的情况、但我无法在代码中发现问题。 我应该怎么做才能实现2KHz 的采样率并使用 UART 进行传输。 请查找随附的代码。

#include 
unsigned int i;
unsigned int value1、value2;
unsigned char val_low、val_high;
unsigned int value;
//
* main.c
*/
void main (void){
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P2DIR |= BIT3;//将 P1.0设置为输出方向
SD24CTL=SD24REFS; //内部基准
SD24CCTL0|=SD24GRP;//通道1的组
SD24CCTL1|=SD24GRP|SD24IE;//通道2的组和同级中断
SD24INCTL1=0x20; //增益= 16对于通道1
SD24CCTL2=0x00;
SD24INCTL2=0x06; //通道2的内部温度传感器


P1SEL0|= BIT2|BIT3; //P1.2、3 eUSCI_A 函数
P1SEL1&=~(BIT2|BIT3);
UCA0CTLW0|=UCSWRST; //在复位
UCA0CTLW0|= UCSSEL_2中保持 eUSCI; //SMCLK
UCA0BR0=0x8E; // 115200波特
UCA0BR1=0x00;
UCA0MCTLW=0x0022;
UCA0CTLW0&=~(UCSWRST); //从复位中释放


(i=0;i<20;i++)
{
__DELAY_CYLES (16000);//1ms 延迟
}

SD24CCTL2|=SD24SC; //将位设置为开始转换
__bis_SR_register (LPM0_bits |GIE);

}

#pragma vector= SD24_vector
__interrupt void SD24_ISR (void)
{
value1=SD24MEM0; //电压
值 e2=SD24MEM1; //当前
值= SD24MEM2; //温度
SD24PRE0= 0xFF; //通道0
SD24PRE1= 0xFF 下一次转换时的延迟; //通道1

val_high=(value1>>8)&(0xFF)的下次转换延迟;
while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
UCA0TXBUF = val_high; // TX -> RXed 字符
val_low=value1&(0xFF);
while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲区准备好了?
UCA0TXBUF = val_low; // TX -> RXed 字符


val_high=(value2>>8)&(0xFF);
while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲区准备就绪?
UCA0TXBUF = val_high; // TX -> RXed 字符
val_low=value2&(0xFF);
while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲区准备就绪?
UCA0TXBUF = val_low; // TX -> RXed 字符
P2OUT ^= BIT3;//使用异或


}切换 P1.0

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您施加的正弦波的频率是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    将您的代码与 msp430i20xx_sd24_01.c 代码示例(我建议您自己执行此操作)进行比较、我发现您正在使用三个 Σ-Δ ADC 通道、并且您将它们与 SD24GRP 位进行分组。 但是、您将在代码示例中注意到、中断使能应位于主通道2上。 在这里、您正在启用通道1上的中断。

    此外、您还可以从 ISR 中删除以下代码行、因为它们实际上不会更改预加载。 无论如何、这种方法是不必要的、因为 ISR 会针对每个样本自动触发(当配置为连续采样时)。 采样率可通过将调制频率(Fmod)除以过采样率(OSR)来计算。 有几个 E2E 主题讨论了如何执行此操作、因此我建议您搜索这些主题。

    SD24PRE0= 0xFF; //通道0
    SD24PRE1= 0xFF 下一次转换时的延迟; //通道1的下一次转换中的延迟
    

    此致、

    James

    MSP 客户应用

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    正弦波频率为50Hz。 通道1中断被启用、因为我只想在通道1结果可用时进入 ISR。 主通道以0f 4KHz 的采样频率生成结果。 我无法通过 UART 以该频率传输数据、因此我将通道1和2的转换结果延迟255个 SD24时钟周期、因此通道1和2的采样频率为2KHz、可通过 UART 以115200发送。

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

    现在我会尝试将波特率降低到9600、直到您使一切正常工作。 接下来、在现有代码中、您实际上不会因预加载而延迟转换、因为您要配置掩码而不是寄存器。 更改预加载不会改变采样频率。 此外,我建议在 main()中以及 SD ISR 之外发送 UART 数据。

    此致、

    James

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

    您是否已解决问题?

    此致、

    James

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

    您好!

    不,问题仍然存在。 我尝试使用不同的策略进行数据记录。 这一次、我首先将样本存储在数组中、然后以9600波特率通过 UART 发送这些样本。 我仍然无法在接收器上接收正确的字符。 我尝试使用逻辑分析仪调试此问题。 TXD 引脚逻辑分析仪无法正确接收字符。 它显示了一个帧错误、其中包含它解码的字符。 请建议如何删除此错误。 请查找随附的代码:

    #include 
    
    /*
    * main.c
    */
    unsigned int value1[401];
    unsigned int value2[401];
    //unsigned int value3[200];
    unsigned int i、j、k;
    unsigned char val_low、val_high;
    //unsigned int g;
    
    void main (void){
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    P2DIR |= BIT3;//将 P1.0设置为输出方向
    SD24CTL=SD24REFS; //内部基准
    SD24CCTL0|=SD24GRP;//通道1的组
    SD24CCTL1|=SD24IE;//组、带通道2并启用中断
    SD24INCTL1=0x20; 通道1的//增益=16
    Value1[0]= 0xFFFF;
    Value2[0]= 0xFFFF;
    
    (i=0;i<8000;i++)
    {
    _DELAY_CYCLES (16000);//1ms 延迟
    }
    
    P1SEL0|= BIT2|BIT3; //P1.2、3 eUSCI_A 函数
    P1SEL1&=~(BIT2|BIT3);
    UCA0CTLW0|=UCSWRST; //保持 eUSCI 处于复位状态
    UCA0CTLW0|= UCSSEL_2; //SMCLK
    //UCA0CTLW0|=UCPEN|UCPAR;
    //UCA0BR0=0x8E; // 115200波特
    //UCA0BR1=0x00;
    //UCA0MCTLW=0x0022;
    UCA0BR0 = 0xAA; // 9600波特
    UCA0BR1=0x06;
    UCA0MCTLW = 0xD600; // 16.384MHz/9600 = 1706.6667 (请参阅 UG)
    UCA0CTLW0&=~(UCSWRST); //从复位中释放
    //g=0;
    J=0;
    
    
    
    I=1;
    SD24CCTL1|=SD24SC; //将位设置为开始转换
    
    _bis_SR_register (GIE);
    while (1)
    {
    if (j==1)
    {
    SD24CCTL1&=~(SD24IE);
    I=1;
    对于(k=0;k<=400;k++)
    {
    VAL_HIGH=(value1[k]>8)&(0xFF);
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
    UCA0TXBUF = val_high; // TX -> RXed 字符
    //_delay_cycles (32000);
    VAL_LOW=value1[k]&(0xFF);
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
    UCA0TXBUF = val_low; // TX -> RXed 字符
    //_delay_cycles (32000);
    
    
    VAL_HIGH=(value2[k]>8)&(0xFF);
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
    UCA0TXBUF = val_high; // TX -> RXed 字符
    //__delay_cycles (32000);
    VAL_LOW=value2[k]&(0xFF);
    while (!(UCA0IFG&UCTXIFG));// USCI_A0 TX 缓冲器准备就绪?
    UCA0TXBUF = val_low; // TX -> RXed 字符
    //_delay_cycles (32000);
    }
    J=0;
    SD24CCTL1|=SD24IE;
    }
    
    }
    
    
    #pragma vector=SD24_vector
    __interrupt void SD24_ISR (void)
    {
    
    value1[i]= SD24MEM0; //电压
    值 e2[i++]=SD24MEM1; //当前
    //value3[i++]=g++;
    if (i=401)
    {
    j=1;
    //g=0;
    }
    
    P2OUT ^= BIT3;//使用异或
    
    }切换 P1.0
    

    此致、

    Abhishek。

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

    我建议删除 UART 代码并下载/调试器件上的其余代码。 然后、在捕获400个样本后、在 CCS 内的"Watch"窗口中查看数组。 应该有一个功能来导出或在 CCS 中绘制数组图、以查看结果是否为正弦。 另一方面、我建议启动一个新项目、以便在合并代码之前使 UART 通信使用虚拟值。

    此外,我很高兴地通知您,TI.com 上提供了新电能测量设计中心和软件库的官方软件版本。 它支持 CCS、并包含支持的 EVM 的文档和设计中心示例。 请从以下链接下载并安装该版本:

    www.ti.com/.../MSP430-ENERGY-MEASUREMENT

    如果您有任何疑问、请告诉我。

    此致、

    James

    MSP 客户应用