硬汉嵌入式论坛

 找回密码
 立即注册
查看: 174|回复: 5
收起左侧

ADS1256

[复制链接]

2

主题

4

回帖

10

积分

新手上路

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

[C] 纯文本查看 复制代码
int32_t adc[8];     //采样结果
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[i] = ADS1256_GetAdc(i);
	}
  }
}

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

以下是我的上位机串口发送函数:
[C] 纯文本查看 复制代码
/* 数据拆分宏定义,在发送大于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[32] ={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[cnt++] = BYTE0(_a);
	Data_Buff[cnt++] = BYTE1(_a);
    Data_Buff[cnt++] = BYTE2(_a);
	Data_Buff[cnt++] = BYTE3(_a);
	
	Data_Buff[cnt++] = BYTE0(_b);
	Data_Buff[cnt++] = BYTE1(_b);
	Data_Buff[cnt++] = BYTE2(_b);
	Data_Buff[cnt++] = BYTE3(_b);
	
	Data_Buff[cnt++] = BYTE0(_c);
	Data_Buff[cnt++] = BYTE1(_c);
    Data_Buff[cnt++] = BYTE2(_c);
	Data_Buff[cnt++] = BYTE3(_c);
	
	Data_Buff[cnt++] = BYTE0(_d);
	Data_Buff[cnt++] = BYTE1(_d);
    Data_Buff[cnt++] = BYTE2(_d);
	Data_Buff[cnt++] = BYTE3(_d);


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


回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-4-12 17:00:30 | 显示全部楼层
不好意思,题目没有打全,我是想用ADA1256采集,然后用匿名上位机显示波形
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-4-13 08:48:25 | 显示全部楼层
不要在中断里面长时间运行代码


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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106757
QQ
发表于 2024-4-13 09:21:51 | 显示全部楼层
失真特别严重 应该不是干扰问题,估计是破坏了1256的采集时序
回复

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-4-13 17:27:41 | 显示全部楼层
树梢的麻雀 发表于 2024-4-13 08:48
不要在中断里面长时间运行代码

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

使用道具 举报

2

主题

4

回帖

10

积分

新手上路

积分
10
 楼主| 发表于 2024-4-13 17:28:40 | 显示全部楼层
eric2013 发表于 2024-4-13 09:21
失真特别严重 应该不是干扰问题,估计是破坏了1256的采集时序

我想问下,1256的DRDY中断和定时器的中断,应该是哪个优先级高一点好啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-4 22:00 , Processed in 0.179799 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表