STM32的HAL库SPI驱动AD7788/7789连续转换

这篇具有很好参考价值的文章主要介绍了STM32的HAL库SPI驱动AD7788/7789连续转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在项目中需要使用高精度的ADC采集电压信号且没有高速需求,而STM32F103RCT6自带的ADC位数较低,故选择了一款24bit的低速ADC芯片AD7789,根据它的引脚与时序特性,复用了STM32的SPI模块来驱动。整个过程踩了一些坑,在此记录分享一下,表述适合初学者食用。

ad7789数据手册,stm32,嵌入式硬件,单片机

stm32cubemx的使用不做赘述,下面以cube为基础从头说起:

1.复用spi1模块:

ad7789数据手册,stm32,嵌入式硬件,单片机

 PA4引脚可以直接配置为SPI1_NSS,且生成的代码在“MX_SPI1_Init”中会有“hspi1.Init.NSS = SPI_NSS_SOFT”;但实际调试中不能用HAL_GPIO_WritePin()直接拉低,想来或许有对应的库函数,但博主懒得找了还是选择配置为GPIO_Output,并修改标签为SPI1_CS,以至于在配置界面左侧出现一堆黄色感叹号,但没影响。

2.设置spi1的参数

ad7789数据手册,stm32,嵌入式硬件,单片机此处配置为全双工模式、软件NSS控制(下面那个默认Disable就好、上一步已配置SPI1_CS)。AD7788/7789符合标准的四线制SPI通信,输入DIN脚,数据准备和数据输出在DOUT/#RDY(引脚标识上划线打不出来用#在前面表示取反,很好理解在数据准备好了的时候RDY从逻辑角度看为真就是1,取反就是拉低为0,所以它手册中的协议描述是在读到该引脚拉低后再在该引脚读数据);

ad7789数据手册,stm32,嵌入式硬件,单片机

再后面,数据的接收我们可以选择用中断处理,但既然是低速要求,轮询也没有问题就先用起来,有兴趣的朋友可以用中断写一下接收部分,中断需要注意ready和data的case区分;轮询情况下,配置就不再管NVIC中的中断配置,直接进入参数设置。轮询的方式是在运行时只需要调用一个HAL_SPI_Receive()函数,它会自动给芯片的SCLK引脚加上时钟信号来激活读取数据的操作,包括发送函数HAL_SPI_Transmit(),也是在调用时才会加上时钟信号来发起写入操作。ad7789数据手册,stm32,嵌入式硬件,单片机

2.1分频

由于是低速ADC,博主直接把分频拉到最大256,其实大可以根据时序特性将波特率优化到一个合适的区间,但为了能先顺利工作起来,就取稳用最低频;

ad7789数据手册,stm32,嵌入式硬件,单片机
低频特性
ad7789数据手册,stm32,嵌入式硬件,单片机
时钟脉宽可确定波特率范围

 2.2时钟

时序图以及引脚说明可以看出操作AD7788/7789的时钟极性与时钟相位为1和1;

ad7789数据手册,stm32,嵌入式硬件,单片机
数据信息下降沿激活后上升沿有效
ad7789数据手册,stm32,嵌入式硬件,单片机
时序图更明了,时钟空闲高电平,上升沿有效

3.生成代码并通信

3.1配置

ad7789数据手册,stm32,嵌入式硬件,单片机

首先通过向通信寄存器CR写入数据来配置。

想要读取数据需要先写入一个读操作、想要设置不同读取模式需要先配置ADC的模式寄存器MR。所以说上电后一切对AD7788/7789的操作都是从向CR写入数据开始,芯片也是处在等待写入的状态之中,而一块这种ADC芯片没有也没必要有非易失性存储单元来保存之前的配置,所以每次上电重新配置(注意芯片的上电和断电、片选的启用和关闭是对应不同的操作)。下面简单描述一下CR中每一位干什么事:

ad7789数据手册,stm32,嵌入式硬件,单片机

 ①第一步写入0x10去往模式寄存器。要给模式寄存器MR写数据需要在CR中选择下一步给MR写入数据,对比一下RS1和RS0,知道这里的CR5、CR4是0和1:

ad7789数据手册,stm32,嵌入式硬件,单片机

 CR3设置为0表示写入,CR2设置为0表示下一步不是连续读取,CR1和CR0设置为0表示差分基准源输入(其他通道有兴趣的朋友可自行了解扩展ADC的应用方案,差分基准输入为基本用途),那么对CR写入的8位二进制数据为:0b 0001 0000,16进制表示就是0x10;

②第二步写入0x06配置为连续转换模式。如图:

ad7789数据手册,stm32,嵌入式硬件,单片机

简单看出,只需要设置MR7、MR6、MR2即可,博主设置了0b 0000 0110 即0x06,表示持续转换模式下单极性输入(AD7788/7789有三种模式:单次转换、连续转换、连续读取[1];两种输入:单极性、双极性[2])。

uint8_t ADC_MODE_CONF[1] = {0x10};
uint8_t ADC_UNBI_MODE[1] = {0x06};
void AD7789_CONF(void){
    
    AD7789_CS_L;
            HAL_SPI_Transmit(&hspi1,ADC_MODE_CONF,1,0xFFFF);
            delay_ms(1);
            HAL_SPI_Transmit(&hspi1,ADC_UNBI_MODE,1,0xFFFF);
            delay_ms(1);
    AD7789_CS_H;
            delay_ms(1);    
}

3.2读取

ad7789数据手册,stm32,嵌入式硬件,单片机

在单次转换的时序图中可以看出,前面0x10、0x82的配置结束后,需要等待#RDY拉低电平、然后向CR写入0x38紧跟着再读取data,博主这里配置了连续转换模式方式还是一样的。 

uint8_t ADC_CON_COV[1] = {0x38};
float AD7789_GET(void){

	AD7789_CS_L;
			uint8_t ADC_READ[3] = {0};
			int ADC;
			float tem;
			while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) != GPIO_PIN_RESET)
				{
				}//等待ready
			delay_ms(1);
			HAL_SPI_Transmit(&hspi1,ADC_CON_COV,1,0xFFFF);//写入0x38
			delay_ms(1);
			HAL_SPI_Receive(&hspi1,ADC_READ,3,0xFFFF);//接收data,24位数据
			
			ADC = ADC_READ[0] << 16 | ADC_READ[1] << 8 | ADC_READ[2];//MSB优先,位数调整
			tem = 5.00*ADC/16777215;//5.00为差分基准源输入
            //ADC &= ~(0x1 << 23);
			//tem = 5.00*ADC/8388607;//双极性模式		
	AD7789_CS_H;
			delay_ms(1);
			return tem;
}

源码量不多,AD7789_GET返回浮点数即为电压值。

4.注 

[1]三种模式:单次转换、连续转换、连续读取

ready拉低后表示数据转换ok,待读取,读取完了之后恢复高电平;单次模式下这只能转换一次然后数据锁存,读取的数据不像连续转换那样读取变化的数据,只记录第一次读取的数据之后便处于掉电状态等待下次reset信号(32个高电平输入)或者真正掉、上电重启;

连续读取模式感兴趣的朋友可以尝试,在调试之初博主出了点问题没有落实下去,虽然芯片设计的默认模式是连续转换不是连续读取,但实际上从手册的描述来看是更方便的,省略了向芯片写入数据的过程,随用随读。

ad7789数据手册,stm32,嵌入式硬件,单片机

调试过程如果出现采集过程确实是连续转换的但结果不对,大概率是片子还处于默认的双极性模式,需要断电重启更新单极性配置 。

[2]单极性、双极性数据:单极性为24bit下,24个0到24个1,表示0到+Vref的电压采集输入范围,双极性为-Vref到+Vref,24bit下第一位为符号位,0x000000到 0x800000 为-Vref到0V电压采集输入,0x800000 到 0xffffff 为0到+Vref电压采集输入;牺牲了一位精度换取带负值的双倍采集范围。文章来源地址https://www.toymoban.com/news/detail-827547.html

到了这里,关于STM32的HAL库SPI驱动AD7788/7789连续转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32驱动ADS1256串口输出-AD转换

    ADS1256是TI推出的一款微功耗、高精度、8 通道、24 位高性能模数转换器。该芯片还带有4个可编程的I/O口、输入缓冲器和可编程增益放大器等,芯片本身可以测量0-5v的信号,高电压采集可以通过把信号分压成0-5v的范围内再给模块输入,所以ADS1256可以采集市面上大多数的标准电

    2024年02月16日
    浏览(49)
  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(60)
  • STM32(HAL库)驱动st7789LCD屏幕(7引脚240*240)

    目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置  2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成  3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改  3.2.3 lcd.c修改  3.2.4 lcd_inut.c修改  3.3 主函数代码 3.3.1 添加头文件 3.3.2 LCD进行初始化

    2024年02月16日
    浏览(45)
  • 利用STM32的HAL库驱动1.54寸 TFT屏(240*240 ST7789V)

      项目:温湿度表 芯片:STM32F030C6T8 液晶:华迪1.54寸 TFT屏 温湿度传感器:SHT30      主要对液晶屏官方驱动代码进行了增加和修改。 一、STM32CubeMX建立工程          I2C1 给SHT30, SPI给液晶屏,TIM16用于内部基础定时,TIM17给LED,USART1打印调试信息。RTC预留。  SPI的DMA设置 

    2023年04月08日
    浏览(45)
  • STM32驱动AD9833模块

    淘宝上买了个AD9833模块,stm32用商家的例程代码可以调频,可以调相,就是调不了幅度。换了几块不同32开发板都不行,重新以正点原子F103的工程为基础把驱动移植进去,最后实现了调幅的功能。这里把代码放上来,希望能帮助遇到相同问题的同学。 开发板: stm32f103c8t6核心

    2024年02月12日
    浏览(49)
  • stm32+AD9910 并口驱动

    搞了好几天DAC芯片AD9910 ,找到多数资料时SPI控制内部RAM或者DDS输出波形,这里总结一下STM32 FMSC 总线输出到AD9910 ,由于AD9910 的PDCLK 为输出,这里采用PWM输入捕获模式获取 AD9910 PDCLK 的下降沿,采用捕获信号触发DMA2  ,DMA 在将数据搬移到总线上,具体代码如下: 使用方法:

    2024年02月13日
    浏览(37)
  • 【STM32】HAL库中的SPI传输(可利用中断或DMA进行连续传输)

    【STM32】HAL库中的SPI传输(可利用中断或DMA进行连续传输) SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,

    2024年02月08日
    浏览(43)
  • STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)

    该芯片需要晶振(Y2)和参考电源电压(U3) AD7705与国产TM7705型号差不多,也就是可以参考国产的手册。 AD7705利用 Σ-Δ 转换技术实现了 16 位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端。片内数字滤波器处理调制器的输出信号。通过片

    2024年02月19日
    浏览(39)
  • 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器

    大家好,我是学电子的小白白,今天带大家了解一款波形发生器芯片——AD9833。 AD9833是AD公司出品的一款DDS波形发生器,能够产生正弦波、三角波和方波输出。 通俗来讲,DDS是一种把波形预先存储在芯片内部的DAC,只要设置好它的工作频率,就能按这个频率来输出特定的波形

    2024年02月02日
    浏览(46)
  • STM32F103硬件SPI驱动ADS1256

    最近实验室有几个项目都需要用到高分辨率AD转换,于是就开始了ADS1256的开发。 新手,焊得丑,见谅(能用就行) 二: 本以为很容易就能做完,结果被采样速率的问题困扰了很久。 代码如下,使用2.5V基准源进行测试,结果在读ADS时经常出现读出0xFFFFFF的情况,只能忍住悲伤

    2024年02月12日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包