DSP电压采集与串口发送

AD的采样频率为100HZ,去采样一个20HZ的正弦信号,一个周期内按说可以采集100个点,但是采集然后采集一个输出一个你就会发现一个周期内才采样了16个点,这是为什么呢?
我的串口也不慢了,波特率为256000,我的AD采集快,而我串口并不能及时发送,如何解决这个问题,请给出解决程序。串口发送程序如下所示,将AD采集的结果用字符串的形式发送出去,

img

    while(1)
    {
     while (AdcRegs.ADCST.bit.INT_SEQ1== 0){}
     AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;

    adc_vol=((AdcRegs.ADCRESULT0)>>4)*3.0/4095;
    LED4_TOGGLE;
    adc_temp=adc_vol*100000;
    adcbuf[0]=adc_temp/100000+0x30;
    adcbuf[1]='.';
    adcbuf[2]=adc_temp%100000/10000+0x30;
    adcbuf[3]=adc_temp%100000%10000/1000+0x30;
    adcbuf[4]=adc_temp%100000%10000%1000/100+0x30;
    adcbuf[5]=adc_temp%100000%10000%1000%100/10+0x30;
    adcbuf[6]=adc_temp%100000%10000%1000%100%10+0x30;
    adcbuf[7]='\0';
    UARTa_SendString("\r\nVOLT=");
    UARTa_SendString(adcbuf);
    }

有一个问题:为什么100Hz采样频率,采样20Hz信号,每个周期能有100个点? 看起来是5个点? ——好吧这个是我理解有问题,意思是1s 100个点。。

还有一些问题:

  1. 你说的1秒16个点,是基于串口返回了16个相同的值?照理每次ADC的信号略微会有些不同,这个看起来像是同一个数据发了16遍。

你这个串口中的结果应该是在一个循环里面执行了,因为一个周期里面的16个值是一样的,如果采的是正弦信号这是不可能的,我猜应该是在函数里面调用了串口发送程序,并且循环执行了16次,跳出循环以后才能再采集新值,所以相邻周期之间的值是不同的,所以这个问题应该不是硬件问题,应该是代码有问题

用缓存啊,采集完的数据不要直接串口发送,先放到一个环型的内存缓冲区中,缓冲区设置两个指针,一个写,ad采集控制,采集一次写入一次,指针加一,读取指针由串口发送程序控制,发走一个数据指针加一,读取指针追上写入指针,所有ad采样数据发送完毕;写入指针如果追上了读出指针,就要考虑是覆盖数据还是等待发送的处理了,

蓝牙调试器之DSP串口蓝牙发送数据
https://blog.csdn.net/zhangdh147/article/details/121284572

右移四位是原来选择的左对齐还是想略去后四位的不稳定数据?如果是后者,发出来的数据想同也是有可能的。
你可以用个直流可调电源作为输入电压,调一下输入电压的大小,测试一下单片机AD口的电压是否有变化,再看串口输出电压的大小。来确定是不是程序的问题。