完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、芯片信息
ADS8326 是TI设计的一款 16 位采样模数转换器,属于SAR型ADC。电源电压范围为 2.7V ~5.5V。 优点是低功耗,高速率,有效速率范围是24kHz~6MHz。 ADS8326 提供出色的线性度和极低的噪声和失真,INL仅有±1 LSB,DNL仅有±0.4 LSB。数据传输采用串行(SPI/SSI 兼容)接口和差分接口。参考电压可设置为 0.1V 至 VDD 范围内的任何电平。低功耗和小尺寸使 ADS8326 在用便携式和电池供电系统种成为理想之选。此外,也非常适合远程数据采集、隔离数据采集、工控、机器人和数据分析。 有MSOP-8 和 SON-8两种封装。 二、典型应用电路 选择双端输入,输入信号接在正端+IN和负端-IN两端,之间要加个1nF的电容,然后输入信号得正负端对地都要接1000pF的滤波电容。 选择单端输入,输入信号对地借一个1000pF的滤波电容即可。 三、时序图分析+软件实现 1.IO口设置 我们只需要用到ADS8326的5、6、7号引脚,对应封装图的CS/SHDN、DOUT和DCLOCK。 CS/SHDN和DCLOCK是MCU输入给ADS8326的,故设置为推挽输出;而DOUT是ADS8326的输出引脚,因为MCU需要读取其bit数据,所以设置为浮空输入,片选位拉高,ADS8326默认状态为失能模式。代码如下: // An highlighted block void ADS8326_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //DOUT是ADS8326的数据输出口,故PA6设置为浮空输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_4); //片选先拉高 } 2.采集信号 代码的编写需要根据时序图。这里给出了两种时序方式,我用第一种。 先把CS拉低,再给个下降沿的时钟脉冲信号,开始采集。 ADS8326_CS = 0; //片选拉低,使能模块 //起始信号 ADS8326_DCLK = 1; delay_us(1); ADS8326_DCLK = 0; delay_us(1); 下列是采集的实现。根据手册数据,采集过程标准是5个时钟周期(上升沿),那么代码内为何多了一个周期呢?因为第6个周期内,DOUT电平从高到低变化,准备进入转换模式,所以整个采集过程需要耗费6个时钟周期。 //发送6个时钟周期,进行采样 for(u8 i=0; i<6; i++) { ADS8326_DCLK = 0 delay_us(1); ADS8326_DCLK = 1; delay_us(1); } 3.转换信号 采集结束后,需要转换为Code。由下图可见,一个转换过程需要16个时钟周期,每个上升沿期间DOUT输出一个bit,最高位MSB最先输出,最低为LSB最后输出。数据处理时需要把最高为左移至最高,最低为放在最低。 代码实现如下: //再发送16个时钟周期,转换数值 for(u8 a=16; a>0; a--) { ADS8326_DCLK = 0; delay_us(1); ADS8326_DCLK = 1; delay_us(1); temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6); //读取每个时钟周期的数据位 data |= temp<<(a-1); //第一个得到的bit为MSB,放在最高位;最后一个是LSB,放在最低位 } //结束信号 ADS8326_DCLK = 0; delay_us(1); ADS8326_DCLK = 1; delay_us(1); ADS8326_CS = 1; //片选拉高,失能模块 return data; 如果在转换结束时保持低电平,则新的数据流以 LSB 优先的数据移出,然后无限输出零,所以,采集结束后需要把片选置高,结束采集过程。整个16 位转换至少需要 22 个时钟周期。 四、实际测试 ADS8326的VREF和VDD相连,3.3V供电。之后用开关电源给一个2.55V的电压到ADS8326,万用表测量值如下,保证精确度。 下列是ADS8326实际采集到的电压值,误差特别小,代码运行成功! 五、资源 完整版代码点此链接下载!(注意:代码内的6个采样周期是下降沿,需要自行改为上升沿,虽然两者对采集的正确性没有影响,但还是要严格按照时序来)。 |
|
|
|
只有小组成员才能发言,加入小组>>
3263 浏览 9 评论
2944 浏览 16 评论
3443 浏览 1 评论
8955 浏览 16 评论
4036 浏览 18 评论
1079浏览 3评论
559浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
552浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2287浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1848浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-10 17:00 , Processed in 0.823698 second(s), Total 48, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号