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.

ADC和串口通讯的问题

Other Parts Discussed in Thread: MSP430G2453

一个应用是用MSP430G2453做的。过程大概如下:上位机发一个指令,MCU进行一次ADC,然后将ADC结果返回上位机。最初是单字节指令,一切正常。后来改为两字节,三字节以后,回传数据周期性地出错,ADC转换值周期性的出错,而且还是错误相同。特别是三字节指令,每隔六到七次正常回传后就有一次无响应,继续发指令后,是一到两次的错误回传后,又可以正常回数据。这是可以不断重复的现象。不知是什么问题?如何解决?

下面的添加附件上不去,无法上串程序。

紧急!!!!

电邮:slqin@sjtu.edu.cn

  • Songlin Qin, 

    请问两字节,三字节时,大概多长时间进行一次ADC采样?另外可否把ADC的配置详细描述一下,或者粘贴那段程序?

  • 首先先确认ad采样有没有周期性的错误,然后再确认通讯是否正常。如果两个都没有问题在查找别的地方可能出现的问题。

  • ADC采样与外部指令有关,程序内部没有设置。出错与采样间隔无关,仅与指令次数,即ADC采样次数有关。出错时是可重复的,周而复始,几次正常,出错两三次,又正常几次,再出错。ADC的出错数据也是相同的。所有的ADC、数据发送都是在接收(RX)中断程序中进行。由于网页错误无法添加附件。请给个邮箱地址,我直接发送过来。程序用CCS5.3 编译。

  • 程序附上。是CCS5.3的项目。对于原始芯片初始指令:11,00,00(16进制数)。

    ZNO_Y2.rar
  • Songlin Qin, 我简单看了看你的程序,请问你想实现使用ADC10依次采样P1.4, 1.5, 1.6, 1.7 上面的电压吗?P1.4, 1.5, 1.6, 1.7应该对应的是ADC10的通道A4, A5, A6, A7. 但是程序中如下面所示,ADC配置你选的是INCH_10,为通道10,是Temperature sensor。另外ADC10AE0也需要把要测的4个通道都使能了。

    建议你把P1.4, 1.5, 1.6, 1.7接上不同的电压值,然后调试ADC10, 看看每个通道采回来的结果都正确了,再进行下一步。

    void ADC_Initial() //ADC 初始化
    {
    ADC10CTL0=SREF_1+ADC10SHT_1+MSC+REFON+REF2_5V+ADC10ON+ ADC10IE;//ENC
    ADC10CTL1=INCH_10+CONSEQ_1+ADC10SSEL_0+ADC10DIV_3; // single sample multiple channel INCH7 maximum channel number
    ADC10AE0|=BIT7;//+BIT5+BIT6+BIT7;// P1.4,5,6,7 ADC option select
    ADC10SA = 0x0200; //DTC set the result starting address
    ADC10DTC1 = 0x04; // 16 conversions
    }

  • 关于ADC10 single sequence的使用方法,建议你参考一下MSP430Ware中的例程,如附件所示。

  • 谢谢,但我感觉是串口的问题,具体应该是:UCA0RXBUF的问题。我将程序调回单字节接收,是能正确运行;但如果在上位指令加上两个无关字符,也就是以三字节发送指令后,是可以响应,但在几个正确响应后,还是会停顿一次,发送错误一次,然后又能正确响应几次.........。

  • G2x33_adc10_10.c 这个程序我看过,问题时这个程序里不知如何获得ADC转换的数值。我试图用ADC10MEMx 的方式查看数据但编译通不过。这里声明一下,我的调试不是用LounchPad,这会不会影响我前面的调试?

  • 例程中使用了ADC10的DTC功能,‘ DTC transfers conversion code to RAM 200h - 206h.’ 将数据依次存到了RAM中。可在对应的RAM地址读取结果。

  • 附件是一个串口调试程序的接收数据框的截图,图中00 83 2C xx 两个数据是错误的响应,在这之前还有一次停止响应。程序已改为单字节运行,在单字节指令下,程序可以正确运行,连续很长时间的运行还是可以保持正确的响应。但是加上两个无效字节形成三字节后,也能正确响应,就是每隔几次正确响应会有一次停止响应何一次错误响应,附件就是这个运行的记录。只加一个无效字节也可以运行,但出错机会小一点,可以每隔十几次正确响应后来一次停顿和一次错误响应。所以我认为可能是UCA0RXBUF的问题。

  • Songlin Qin,

    关于你描述的这个问题,我认为你应该逐步定位。先定位问题究竟是从哪里引入的,是ADC采样错误了,还是UART发送出来的数据时错误的?

    故你可以在线调试,当MSP430发送出错误数据时,查看一下tmphigh 和 tmplow,或者你可以写个数组,存多组发送出去的ADC数据,看看本身采回来的ADC数据是否一直正确,如果ADC是正确的话,那么就是UART出错了。然后再分别看看,是UART发送出错了,还是接收命令时出错了。逐步定位问题。

    我不理解你所说的单字节指令和多字节指令的含义,若方便的话,可否解释一下,程序的工作流程和字节的含义。O(∩_∩)O~

  • 串口通讯一次只发送一个8BIT的字符,所谓单字节就是上位机只发送一个字符,例如:上位机向下发送30(hex),下位机,标号为30(hex)的MSP430MCU就会作出响应。三字节指令,则MSP430需要连续接收三个字节后,对这三个字符进行判别确认后才作出响应与否。前面进行实验的是伪三字节指令,连续下发的三个字符中有一个是正确指令。因为有一个是正确的所以还是会有正确响应。在连续多次后会有一次拒绝响应,下一次接收后就给了一次错误的响应(ADC数据错误),再下一次就恢复正常。所谓ADC数据的正确是与外部电压确认过得。最有趣的是这个现象是周期性,循环往复可重复。连ADC的数据也重复。这种多字节的指令我在51中是多次使用了。看到别人在430F系列中也使用的。

    程序流程如下:初始化以后,进入LPM3,当有一个UCAORXBUF中断,读接收字符并判别,如正确;就执行ADC,然后再上传数据;为了简化现在只有温度和P1.7两个数据。另外还有一个进程,如果P1.3有电压跳变也会有一个中断响应,并对事件计数,然后存入flash中永久保存。这个数不会出错,因为它在flash中。个人以为错误可能是在UCAORXBUF与RAM之间产生。

  • Songlin Qin,

    请问MSP430是全部接收完3个字符后再分析有没有 0x30,然后再决定进不进行ADC采样呢?还是接收一个分析一次,只要有0x30,就进行ADC采样并发送呢?

  • 因为我把程序改为单字节指令,所以是接收一个字符就进行判别。原来三字符指令时,就是每接收三个字符在进行判别。