求助各位佬,可以帮小弟看看这段代码怎么改吗,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寄存器
}
}
|