STM32 AD7685 AD7684 AD7686 AD7687 AD7683 AD7680系列调试记录

介绍部分

AD7685 AD7684 AD7686 AD7687 AD7688 AD7688 其差别在于转换速率不同,数据读取、分辨率完全一致。
在这里插入图片描述

单端:单输入型,只允许0V-VCC.
伪差分 :双输入但是 IN+& IN- 都必须大于0V 其中间值0-vcc/2
真差分:可以接受-vcc-vcc的信号。(简单理解,勿喷)

使用的测试板卡为AD7685 PMOD 官方demo 其原理图如下,标注部分为默认设置

在这里插入图片描述
在这里插入图片描述

数据读写时序与引脚分配

在这里插入图片描述
在这里插入图片描述

STM32 配置

16位SPI情况下相关 配置 CNV配置

请添加图片描述
在这里插入图片描述
需要及其注意的一点是 SCK GPIO 需要配置为上拉!!!!

/*伪代码*/
		 typedef union 
{
	uint8_t r_data[2];
	uint16_t adc_data;

}ad7685;
ad7685 rdata;


//main
HAL_GPIO_WritePin(SPI3_CS_GPIO_Port,SPI3_CS_Pin,GPIO_PIN_SET);
delay_us(20);// 实际延时1.6us datasheet 上为2.2us max
HAL_GPIO_WritePin(SPI3_CS_GPIO_Port,SPI3_CS_Pin,GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi3,rdata.r_data,1,0xff);
vdata = ((float)(rdata.adc_data)/65535)*5.0;
HAL_Delay(1000);
//  特别注意其中SCK 需要配置为下拉模式。否则数据容易出问题!!!!
16位3.3V输入电压时的数据波形:

在这里插入图片描述

16位读取速率(可以更快取消除法运算或使用DSP)

在这里插入图片描述

8位通用SPI 配置

考虑到目前支持16位spi的单片机不多,且实际上读取一次sck发送16x2=32组脉冲,对于读取速度有相应影响遂开发8位读取模式。
在这里插入图片描述
在这里插入图片描述

8位模式下读取速率

在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
对于AD7683芯片的软件SPI驱动,你可以使用STM32的库函数来实现。以下是一个简单的示例代码,演示了如何配置和使用软件SPI与AD7683进行通信: ```c #include "stm32f10x.h" #include "delay.h" // 可以使用延时函数来生成SPI时钟 // 定义AD7683的片选引脚 #define AD7683_CS_PIN GPIO_Pin_4 #define AD7683_CS_PORT GPIOA // 定义AD7683的SCLK引脚 #define AD7683_SCLK_PIN GPIO_Pin_5 #define AD7683_SCLK_PORT GPIOA // 定义AD7683的MISO引脚 #define AD7683_MISO_PIN GPIO_Pin_6 #define AD7683_MISO_PORT GPIOA // 定义AD7683的MOSI引脚 #define AD7683_MOSI_PIN GPIO_Pin_7 #define AD7683_MOSI_PORT GPIOA // 初始化GPIO引脚 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置片选引脚 GPIO_InitStructure.GPIO_Pin = AD7683_CS_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(AD7683_CS_PORT, &GPIO_InitStructure); // 配置SCLK引脚 GPIO_InitStructure.GPIO_Pin = AD7683_SCLK_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(AD7683_SCLK_PORT, &GPIO_InitStructure); // 配置MISO引脚 GPIO_InitStructure.GPIO_Pin = AD7683_MISO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(AD7683_MISO_PORT, &GPIO_InitStructure); // 配置MOSI引脚 GPIO_InitStructure.GPIO_Pin = AD7683_MOSI_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(AD7683_MOSI_PORT, &GPIO_InitStructure); } // 片选AD7683 void AD7683_Select(void) { GPIO_ResetBits(AD7683_CS_PORT, AD7683_CS_PIN); } // 取消片选AD7683 void AD7683_Deselect(void) { GPIO_SetBits(AD7683_CS_PORT, AD7683_CS_PIN); } // 发送一个字节的数据到AD7683 void AD7683_SendByte(uint8_t byte) { uint8_t i; for (i = 0; i < 8; i++) { // 设置MOSI引脚的值 if (byte & 0x80) { GPIO_SetBits(AD7683_MOSI_PORT, AD7683_MOSI_PIN); } else { GPIO_ResetBits(AD7683_MOSI_PORT, AD7683_MOSI_PIN); } // 生成上升沿 GPIO_SetBits(AD7683_SCLK_PORT, AD7683_SCLK_PIN); delay_us(1); // 生成下降沿 GPIO_ResetBits(AD7683_SCLK_PORT, AD7683_SCLK_PIN); delay_us(1); // 数据左移一位 byte <<= 1; } } // 接收一个字节的数据从AD7683 uint8_t AD7683_ReceiveByte(void) { uint8_t byte = 0; uint8_t i; for (i = 0; i < 8; i++) { // 生成上升沿 GPIO_SetBits(AD7683_SCLK_PORT, AD7683_SCLK_PIN); delay_us(1); // 读取MISO引脚的值 byte <<= 1; if (GPIO_ReadInputDataBit(AD7683_MISO_PORT, AD7683_MISO_PIN)) { byte |= 0x01; } // 生成下降沿 GPIO_ResetBits(AD7683_SCLK_PORT, AD7683_SCLK_PIN); delay_us(1); } return byte; } // 初始化AD7683 void AD7683_Init(void) { // 配置GPIO引脚 GPIO_Configuration(); // 初始化片选引脚为高电平(取消片选) AD7683_Deselect(); } // 从AD7683读取一个字节的数据 uint8_t AD7683_ReadByte(void) { uint8_t data; // 片选AD7683 AD7683_Select(); // 发送读取命令 AD7683_SendByte(0x00); // 接收数据 data = AD7683_ReceiveByte(); // 取消片选AD7683 AD7683_Deselect(); return data; } // 向AD7683写入一个字节的数据 void AD7683_WriteByte(uint8_t byte) { // 片选AD7683 AD7683_Select(); // 发送写入命令 AD7683_SendByte(byte); // 取消片选AD7683 AD7683_Deselect(); } ``` 请注意,这只是一个基本的示例代码,你需要根据自己的具体需求进行修改和完善。同时,你还需要实现延时函数 `delay_us()` 来生成SPI时钟。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值