完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我在使用AD7705进行双通道采样时,交替向通信寄存器写入通道1和通道2的数据读取命令,但每次写命令后,返回的数据是随机的,并没有与通道对应好,请各位帮看下代码有无问题
Uint16 test_cnt1 = 0 ,test_cnt2 = 0; Uint16 ch_samp_flag = 1; /* ch_samp_flag = 1,通道1采样;ch_samp_flag = 0,通道2采样 */ Uint16 out_vol_samp_dig = 0, out_cur_samp_dig = 0; float out_vol_samp = 0, out_cur_samp = 0; float out_vol_samp_real = 0, out_cur_samp_real = 0; void AD7705_WriteByte(uint8_t addr) { CS_ADC_LOW(1); // delay_us(1); spi2_read_write_byte(addr); // delay_us(1); CS_ADC_HIGH(1); } void Init_AD7705(uint8_t channel) { uint8_t i; for(i=0;i<150;i++)/* 多于连续32个 DIN=1 使串口复位 */ { AD7705_WriteByte(0xff);//持续DIN高电平写操作,恢复AD7705接口 } delay_ms(1); switch (channel) { case 1: AD7705_WriteByte(0x20);/* 写时钟寄存器选中ch1*/ AD7705_WriteByte(0x07);/* 4.9152MHz时钟,200Hz数据更新速率 */ AD7705_WriteByte(0x10);/* 选择设置寄存器,使用chnanel 1*/ AD7705_WriteByte(0x44);/* 写设置寄存器 ,设置成单极性、有缓冲、增益为1、滤波器工作、自校准 */ break; case 2: AD7705_WriteByte(0x21);/* 写时钟寄存器选中ch2 */ AD7705_WriteByte(0x07);/* 4.9152MHz时钟,200Hz数据更新速率 */ AD7705_WriteByte(0x11);/* 选择设置寄存器,使用chnane 2*/ AD7705_WriteByte(0x44);/* 写设置寄存器,设置成单极性、有缓冲、增益为2、滤波器工作、自校准*/ break; default: break; } } uint16_t ReadDataAD7705_CH1(void) { // uint16_t result1 = 0; uint16_t DataH = 0, DataL = 0; static uint16_t result1_z1=0,result1 = 0; static uint16_t ad7705ch1_write_rdy = 0 ; result1 = result1_z1; if(ad7705ch1_write_rdy == 0) { AD7705_WriteByte(READ_DATA_FROM_CH1); ad7705ch1_write_rdy = 1; } else { if(SPI2_READ_DRDY == 0) { CS_ADC_LOW(1); /* 使能ADC */ DataH = spi2_read_write_byte(0xff); /* 取数据高字节 */ DataL = spi2_read_write_byte(0xff); /* 取数据低字节 */ CS_ADC_HIGH(1); /* 使能ADC */ DataH = DataH << 8; result1 = DataH | DataL; result1_z1 = result1; ad7705ch1_write_rdy = 0; test_cnt2++; ch_samp_flag = 0; } } return result1; } uint16_t ReadDataAD7705_CH2(void) { uint16_t DataH = 0, DataL = 0; static uint16_t result2_z1 = 0, result2 = 0; static uint16_t ad7705ch2_write_rdy = 0; result2 = result2_z1; if(ad7705ch2_write_rdy == 0) { AD7705_WriteByte(READ_DATA_FROM_CH2); ad7705ch2_write_rdy = 1; } else { if(SPI2_READ_DRDY == 0) { CS_ADC_LOW(1); /* 使能ADC */ DataH = spi2_read_write_byte(0xff); /* 取数据高字节 */ DataL = spi2_read_write_byte(0xff); /* 取数据低字节 */ CS_ADC_HIGH(1); /* 使能ADC */ DataH = DataH << 8; result2 = DataH | DataL; result2_z1 = result2; ad7705ch2_write_rdy = 0; ch_samp_flag = 1; } } return result2; } void AD7705MulChSamp(void) { if(ch_samp_flag == 1) { out_vol_samp_dig = ReadDataAD7705_CH1(); out_vol_samp = (float)(out_vol_samp_dig * 1.225/65536); } else { out_cur_samp_dig = ReadDataAD7705_CH2(); out_cur_samp = (float)(out_cur_samp_dig * 1.225/65536); } out_vol_samp_real = (float)out_vol_samp * OutVolSampGain; out_cur_samp_real = (float)out_cur_samp * OutCurSampGain; } |
|
相关推荐
1个回答
|
|
根据您提供的代码片段,我将分析可能导致双通道采样数据混乱的原因,并提供一些建议。
1. 首先,确保您已经正确初始化了AD7705。在开始采样之前,您需要设置正确的控制寄存器值,以确保AD7705按照预期工作。请检查您的初始化代码,确保所有必要的寄存器都已正确设置。 2. 其次,检查您的通信协议。确保您在写入通道1和通道2的数据读取命令时,通信协议是正确的。这包括正确的起始位、数据位、校验位和停止位。如果通信协议不正确,可能会导致数据混乱。 3. 检查您的CS_ADC_LOW()函数。在您的代码中,您使用了CS_ADC_LOW(1); 这可能不是正确的方法来设置片选信号。通常,片选信号应该设置为低电平以选中器件,然后设置为高电平以取消选中。请检查您的硬件连接和CS_ADC_LOW()函数的实现,确保片选信号正确地控制AD7705。 4. 确保您的时序正确。在SPI通信中,时序非常重要。请检查您的代码,确保在发送命令和读取数据时,时序是正确的。这包括适当的延时和数据采样时间。 5. 检查您的数据读取逻辑。在您的代码中,您交替向通信寄存器写入通道1和通道2的数据读取命令。请确保在读取数据时,您正确地识别了通道1和通道2的数据。这可能需要在读取数据之前发送一个特定的命令,或者在读取数据之后进行一些额外的处理。 6. 最后,检查您的硬件连接。确保AD7705与微控制器之间的连接是正确的,包括SPI数据线、时钟线、片选线等。如果硬件连接有问题,可能会导致数据混乱。 综上所述,要解决双通道采样数据混乱的问题,您需要检查初始化、通信协议、时序、数据读取逻辑和硬件连接。希望这些建议能帮助您找到问题所在并解决问题。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【高手问答】电路的功能是为了0.6v到40v之间调压,运放发热严重
2367 浏览 8 评论
USB3.0 工业相机的传输速率是否受到电脑主板某些硬件的限制?
1032 浏览 0 评论
2231 浏览 1 评论
1270 浏览 0 评论
2770 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 12:52 , Processed in 0.668151 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号