完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
对ad7193芯片设置完后,主循环里每个1秒调用一次单次采样函数。结果发现读取的数偏小,芯片内部对采样的ad值按8倍增益放大,STM32读取值后再除8再转换成电压值或电阻值。后发现,内部配置寄存器对应增益放大的值不对。执行完单次采样后,读配置寄存器值,增益位是正确的。在单次采样函数调用前,读配置寄存器值,数就不正确了。
while(1) { if(flag_1ms == 1) { flag_1ms = 0; AD7193_RangeSetup(1, AD7193_CONF_GAIN_8); value_temp2 = AD7193_GetRegisterValue(AD7193_REG_CONF, 3, 1); value_temp1 = Pt100Measure(1); value_temp3 = AD7193_GetRegisterValue(AD7193_REG_CONF, 3, 0); value_temp4 = AD7193_GetRegisterValue(AD7193_REG_CONF, 3, 1); usart1_send(0xDD); usart1_send(value_temp1 >> 16); usart1_send(value_temp1 >> 8); usart1_send(value_temp1); usart1_send(value_temp2 >> 16); usart1_send(value_temp2 >> 8); usart1_send(value_temp2); usart1_send(value_temp3 >> 16); usart1_send(value_temp3 >> 8); usart1_send(value_temp3); usart1_send(value_temp4 >> 16); usart1_send(value_temp4 >> 8); usart1_send(value_temp4); } } 串口接收过来的数据是,第一次是:DD 00 00 77 10 01 1A 10 01 1A 10 01 1B 以后就一直是: DD 00 00 3B 10 01 1A 10 01 1A 10 01 1B 配置寄存器是10 01 1A或10 01 1B,其末三位对应的是增益倍数。B(1011)对应的是放大8倍,A(1010)对应的是保留字。 -------------------------------------------------------------------------------------------------- 感觉很奇怪:既然执行完单次采样后,读配置寄存器值,其最后是B,那么这个循环接收后,下一个循环开始的时候,也应该是B啊。 将增益倍数改成128后,读取的值是:DD 00 01 F6 10 01 1E 10 01 1F 10 01 1F 仍然是单次采样前读取的配置寄存器值,比采样后读取的值小,差最后一位。而后边的数据才是正确的。 ---------------------------------------------------------------------------------------------------- 有改变增益倍数试了几次。 增益位128和64时,调用单次采样函数前,读取的配置寄存器对应的增益倍数是64,调用函数后,读取的增益倍数是128; [size=14.399999618530273px]增益位32和16时,调用单次采样函数前,读取的配置寄存器对应的增益倍数是16,调用函数后,读取的增益倍数是32; [size=14.399999618530273px] [size=14.399999618530273px]--------------------------------------------------------------------------------------------------------- [size=14.399999618530273px] [size=14.399999618530273px]更正一下,AD7193_RangeSetup(1, AD7193_CONF_GAIN_8); |
|
相关推荐
6个回答
|
|
想着再放大一点,不过不好操作了。 --------------------------------------------------------------------------------------------------------------------------------------------------------- 额,才发现,其实可以放大的。 首: 尾: |
|
|
|
额,发现以上波形,是在while循环先执行一次设置8倍增益操作后的波形。
不过配置增益函数里,也是先调用了一次读取配置寄存器数。 我把while循环里的配置8倍增益这句屏蔽掉,while循环前还保留着一个。 以下是全波形和首尾波形。 全: 首: 尾: 以上所有图,为sclk和miso波形图。 读取配置寄存器,是用到了40个sckl下降沿。现在一想,可能没截全,屏上可能差几个才到40个。 |
|
|
|
说错了,ad7193应该是上升沿采样。 首一: 首二: 尾一: 尾二: |
|
|
|
其实是读的配置寄存器时,因为配置寄存器是3个字节的,加上1个字节的命令字。SPI_CLK只需要32个时钟周期。 比较了下首尾两次读取配置寄存器是SPI_MISO的波形,是一致的。只不过末尾最后的SCL上升沿时,对应的SPI_MISO也正好是个上升跳变,估计是我SPI读写函数写的不好,应该加个延时。 这样看来的话,首尾读去配置寄存器的值,应该都是10011A,可能因为SPI读写函数的问题,读取最后一位那里出了错。 但是,我配置的是8倍增益,对应的应该是10011B才对。最后一位如果是A的话,对应的是“保留”的意思... ----------------------------------------------------------------------------------------------------- 想了想,既然我读取函数这里有问题,那么也有可能是因为写入函数也有问题,所以造成了这种现象。 |
|
|
|
世啊木啊 发表于 2019-2-22 19:13 怀疑最后一个SCK上升沿时,对应的MISO也是上升跳变,是由于CS片选信号被拉高引起的。 于是修改了下SPI读写函数,确保CS被拉低延时一段时间后再开始数据读写,读写完成后,延时一段时间,再将CS拉高。 结果测试波形还是这样的。 |
|
|
|
世啊木啊 发表于 2019-2-22 19:31 您好, 你可以按照下面的逻辑写一下SPI的读取函数。在CLK下降沿的时候,等待一会儿,读数,在拉高CLK CLK_HIGH; CS_LOW; __NOP(); for(j=0 ; j<8 ; j++) { CLK_LOW; __NOP(); __NOP(); if(MISO) RxBuffer |= (1<<(7-j)); else RxBuffer &= ~(1<<(7-j)); CLK_HIGH; __NOP(); __NOP(); } __NOP(); CS_HIGH; CLK_LOW; |
|
|
|
只有小组成员才能发言,加入小组>>
992 浏览 2 评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387 浏览 2 评论
ADP5092 SYS端口为2.09V,但是REG_OUT为0是什么原因?
1940 浏览 1 评论
ad7193差分输入ain1与ain2差是正值时,读到电压与实际值误差小,但为负值值,误差就变的很大
4271 浏览 2 评论
9063 浏览 1 评论
ADC3442采集,分析数据出现有规则毛刺,请问是哪方面的问题啊?
1524浏览 3评论
AD7190状态寄存器一直是0x80,连续转换模式下RDY不拉低
1694浏览 2评论
992浏览 2评论
1669浏览 2评论
给ADUM4223 增加信号驱动15V电压就不正常, 波动很大会被烧是什么情况?
1387浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:48 , Processed in 1.209492 second(s), Total 57, Slave 50 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号