Ming104 发表于 2024-4-12 16:58:27

ADS1256

求助各位佬,可以帮小弟看看这段代码怎么改吗,ADS1256使用的是安富莱的驱动,上位机使用的是匿名上位机。
遇到的问题是:波形失真特别严重。
我已经做过的测试是:单独跑安富莱的Printf电压的源代码可以准确打印出电压,使用我的匿名上位机串口发送函数,发送一个正弦波测试,也可以显示一个正弦波,但是两个功能合起来就不行了。
串口发送我使用定时器中断控制,定时器频率是200Hz,采样率是100sps。中断优先级是ADS1256高于定时器
以下是我的主函数:

int32_t adc;   //采样结果
uint8_t i;
uint8_t ch_num;   //通道数 = 8 或者4
int main ( void )
{
    USART1_Config ();   //初始化串口1,波特率115200                                                      
    CPU_TS_TmrInit();   //初始化DWT计数器,用于延时函数
    LED_GPIO_Config();    //初始化 LED 灯
    Timer_Init();                  //定时中断初始化

   Delay_ms(100);        /* 等待上电稳定,等基准电压电路稳定, bsp_InitADS1256() 内部会进行自校准 */
    bsp_InitADS1256();        /* 初始化配置ADS1256.PGA=1, DRATE=30KSPS, BUFEN=0, 输入正负5V */

/* 设置PGA增益,数据更新速率 */
    ADS1256_CfgADC(ADS1256_GAIN_1, ADS1256_100SPS);        /* 配置ADC参数: 增益1:1, 数据输出速率100Hz */
    ADS1256_StartScan(1);        /* 启动中断扫描模式. 0表示单端8路,1表示差分4路 */
    ch_num = 4;                /* 通道数 = 8 或者4 */   
   
while ( 1 )
{
    for (i = 0; i < ch_num; i++)
        {
          adc = ADS1256_GetAdc(i);
        }
}
}

/**
* 函    数:TIM2中断函数
* 参    数:无
* 返 回 值:无
* 注意事项:此函数为中断函数,无需调用,中断触发后自动执行
*         函数名为预留的指定名称,可以从启动文件复制
*         请确保函数名正确,不能有任何差异,否则中断函数将不能进入
*/
void TIM2_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)                //判断是否是TIM2的更新事件触发的中断
        {
      Data_send(adc,adc,adc,adc);
                TIM_ClearITPendingBit(TIM2, TIM_IT_Update);                        //清除TIM2更新事件的中断标志位                                                                                                        //中断标志位必须清除                                                                                                        //否则中断将连续不断地触发,导致主程序卡死
        }
}

以下是我的上位机串口发送函数:
/* 数据拆分宏定义,在发送大于1字节的数据类型时,比如int16、float等,需要把数据拆分成单独字节进行发送 */

#define BYTE0(dwTemp)       ( *( (char *)(&dwTemp) + 0) )
#define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )
/**************************************************************************
函数功能:发送上位机绘制波形函数
入口参数:发送的参数(32位,32位,32位,32位)
返回值:无
**************************************************************************/
uint8_t Data_Buff ={0XAA,0XFF,0XF1};
// 匿名通信帧格式:帧头固定值0xAA,0xFF表示广播,0xF1为自由帧ID

void Data_send(int32_t _a,int32_t _b,int32_t _c,int32_t _d)
{
        uint8_t i,cnt=4;        //cnt对一帧中的第几个字节计数
        uint8_t sc=0,ac=0;        //sc为和校验,ac为附加校验
       
        Data_Buff = BYTE0(_a);
        Data_Buff = BYTE1(_a);
    Data_Buff = BYTE2(_a);
        Data_Buff = BYTE3(_a);
       
        Data_Buff = BYTE0(_b);
        Data_Buff = BYTE1(_b);
        Data_Buff = BYTE2(_b);
        Data_Buff = BYTE3(_b);
       
        Data_Buff = BYTE0(_c);
        Data_Buff = BYTE1(_c);
    Data_Buff = BYTE2(_c);
        Data_Buff = BYTE3(_c);
       
        Data_Buff = BYTE0(_d);
        Data_Buff = BYTE1(_d);
    Data_Buff = BYTE2(_d);
        Data_Buff = BYTE3(_d);


        Data_Buff=cnt-4;    //通信帧的第4个内容:数据长度(以字节位单位)
       
        for(i=0;i<cnt;i++)       //计算校验位
        {
                sc+=Data_Buff;   //sc是对数据进行累加,取低8位
                ac+=sc;             //ac是对sc进行累加,取低8位
        }
        //将计算好的校验位装载到通信帧的最后两个字节
        Data_Buff = sc;
        Data_Buff = ac;
   
    for( i = 0 ; i < cnt; i++)
        {
      while((USART1->SR&0X40)==0);//等待上一个数据发送完成
      USART1->DR = Data_Buff;//将要发送的Data_Buff写入到DR寄存器
        }       
}

Ming104 发表于 2024-4-12 17:00:30

不好意思,题目没有打全,我是想用ADA1256采集,然后用匿名上位机显示波形

树梢的麻雀 发表于 2024-4-13 08:48:25

不要在中断里面长时间运行代码


盲猜你串口发送期间出了问题,建议移除到中断外然后低频发送试试

eric2013 发表于 2024-4-13 09:21:51

失真特别严重 应该不是干扰问题,估计是破坏了1256的采集时序

Ming104 发表于 2024-4-13 17:27:41

树梢的麻雀 发表于 2024-4-13 08:48
不要在中断里面长时间运行代码




我试着提高串口波特率到500000,这回100Hz以内基本可以显示了

Ming104 发表于 2024-4-13 17:28:40

eric2013 发表于 2024-4-13 09:21
失真特别严重 应该不是干扰问题,估计是破坏了1256的采集时序

我想问下,1256的DRDY中断和定时器的中断,应该是哪个优先级高一点好啊
页: [1]
查看完整版本: ADS1256