文章目录

  • ADN8810数据手册
  • ADN8810的硬件电路
  • CUBEMX配置
  • Keil编程
    • 调试过程(需要结果可以跳过)
    • 模块化驱动代码
      • ADN8810.c
      • ADN8810.h
      • main.c
  • 日志输出

ADN8810数据手册

ADN8810数据手册从中可以获取ADN8810的通信方式。最重要的当然是时序图和时序特性表。


可以看到ADN8810是SPI的通信方式,我们主要关注SDI的数据内容。前四位为地址位。A3注释说到必须为逻辑低A2~A0就是地址位。所以总线上最多可以挂八块ADN8810电流源。后12位就是数据位。可以看出其通信方式非常简单。

ADN8810的硬件电路

这里我是直接购买的成品板,主要关注的地方就是地址线和PCB板上留出的接口。地址线默认全部下拉为0;SDI、SCKL、CS和RST为SPI通信所需的死鬼线。然后发现还多了一个CE-EN,看名字应该是使能。只能去数据手册中看它的作用。

每个芯片都会有引脚介绍,发现12脚是可以直接接AVSS,也就是板子中的模拟地。板子中已经拉低了。所以写程序暂时不用管这个,使能有需要再加。首要任务是让电流源有输出。

既然如此这个板子的驱动逻辑就非常简单了,前四位为0000,后十二位为想发的数据。开始写软件。

CUBEMX配置


!!!这里的SPI时钟极性一定要为HIGH,上图中有错误,按照默认的low会出现问题,下一篇单独讲。!!!
时钟和串口上篇配置过了,spi配置如图,因为只需要单片机给ADN8810发送数据,所以模式可以选半双工主机模式,我这直接默认参数全双工主机模式了多余了一个MISO(主收从发)。data size16位,First Bit要注意了,并不是所有的都是默认MSB First,要看数据手册,AND8810正好是MSB First。然后分频,数据手册写到时钟不能超过12M,随便给了个2.25M。USB不用配置。


生成一下代码。

Keil编程

调试过程(需要结果可以跳过)

初始化一下SPI,用的spi2所以是hspi2。

  /* USER CODE BEGIN 2 */HAL_SPI_MspInit(&hspi2);EMLOG(LOG_DEBUG,"app start");/* USER CODE END 2 */

ADN8810驱动

//大概延时
void delay100ns(void)
{//72MHz __NOP();__NOP();__NOP();__NOP;__NOP();__NOP();__NOP();__NOP();
}   void ADN8810_Write(uint8_t ADDR, uint16_t DACdata)
{uint16_t SendValue;DACdata &=0x0fff;  //DACdata高四位清0SendValue = ADDR;  SendValue = SendValue <<12;//ADDR左移12位到SendValue的高四位SendValue = SendValue + DACdata;//SendValue的低12位赋值DACdata    //看时序图写驱动//保证CS 和RST初始为高HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);delay100ns();HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);  //cs拉高delay100ns();   //高脉宽最少30nsHAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);//cs拉低//开始传输数据HAL_SPI_Transmit(&hspi2,(uint8_t *)&SendValue,1,10);//拉高CSHAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);  delay100ns(); //高电平最少保持30ns才能拉低RESET//RESET低脉宽至少40ns 用RESET就清空了需要一直传数据//传一次一直保存就注释掉//HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET);//delay100ns();//HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);}

在while1中加入

ADN8810_Write(0x00, 0x00ff);  //地址必须为0,DAC数据随便。
HAL_Delay(1000);

烧录接线后用电流表测板子是否有输出。对比逻辑分析仪和数据手册的结果证明时序正确。后面可以通过逻辑分析仪可以调整delay ns的时间。

我们需要的输出多半是以毫安为单位,ADN8810是0~4095没有单位,所以需要有一个数据转换。将毫安值转换为12位DAC的数据。数据手册给了公式。

把code = xxxxx解出来就好了。
#define VREF 2.99728 //单位V 从板子上测的电压和电阻
#define RSN 2.2 //单位Ω

#define KI RSN*61440/((RSN+1500)*VREF) // mA
code = Iout *KI

模块化驱动代码

ADN8810.c

#include "ADN8810.h"
void delay100ns(void)
{//72MHz __NOP();__NOP();__NOP();__NOP;__NOP();__NOP();__NOP();__NOP();
}   void ADN8810_Write(uint8_t ADDR, uint16_t DACdata)
{uint16_t SendValue;DACdata &=0x0fff;//高四位清0SendValue = ADDR;SendValue = SendValue <<12;//ADDR左移12位到SendValue的高四位SendValue = SendValue + DACdata;    //保证CS 和RST初始为高HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);delay100ns();HAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);  //cs拉高delay100ns();   //高脉宽最少30nsHAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_RESET);//cs拉低//开始传输数据HAL_SPI_Transmit(&hspi2,(uint8_t *)&SendValue,1,10);//拉高CSHAL_GPIO_WritePin(CS_GPIO_Port,CS_Pin,GPIO_PIN_SET);  delay100ns(); //高电平最少保持30ns才能拉低RESET//RESET低脉宽至少40nsHAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_RESET);delay100ns();HAL_GPIO_WritePin(RST_GPIO_Port,RST_Pin,GPIO_PIN_SET);}void ADN8810_OUT_Current(uint8_t ADDR,double Current){uint32_t DATA0;EMLOG(LOG_INFO,"KI = %f ",KI);EMLOG(LOG_INFO,"Current = %f ",Current);
//  EMLOG(LOG_INFO,"Current*KI=%d",(Current*KI));DATA0 = (Current*KI);if(DATA0>=0x0fff){DATA0 = 0x0fff;EMLOG(LOG_WARN,"DATA0>=0x0fff");}EMLOG(LOG_INFO,"DATA0=%d",DATA0);ADN8810_Write(ADDR,DATA0);
}

ADN8810.h

#ifndef __ADN8810_H
#define __ADN8810_H/*Io = Code*(Vref/4096)*(1/Rsn)*(Rsn/150000+0.1)*/#include "main.h"
#include "spi.h"
#define VREF  2.99728 //单位V#define RSN   2.2 //单位Ω
#define KI     RSN*61440/((RSN+1500)*VREF)   // mA
//#define void ADN8810_OUT_Current(uint8_t ADDR,double Current);
void delay100ns(void);
void ADN8810_Write(uint8_t ADDR, uint16_t DACdata);
//需要驱动五路电流源所以
typedef enum{ADN8810_ADDR0 = 0x00,ADN8810_ADDR1 = 0x01,ADN8810_ADDR2 = 0x02,ADN8810_ADDR3 = 0x03,ADN8810_ADDR4 = 0x04,
}ADN8810_ADDR;
//有地址和目标值和测量值,预留测量值后面可以闭环
typedef struct{char          Info[20];ADN8810_ADDR  ADDR;double        Current_Target;double        Currenr_Measure;
}ADN8810;#endif

main.c

  /* USER CODE BEGIN 2 */HAL_SPI_MspInit(&hspi2);EMLOG(LOG_DEBUG,"app start");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */ADN8810 I_SOA = {"I_SOA",ADN8810_ADDR0,123,0};while (1){EMLOG(LOG_DEBUG,"   ");EMLOG(LOG_DEBUG,"While Run");//scanf("%lf",&I_SOA.Current_Target);EMLOG(LOG_INFO,"I_SOA.Current_Target = %lf",I_SOA.Current_Target);ADN8810_OUT_Current(I_SOA.ADDR,I_SOA.Current_Target);EMLOG(LOG_INFO,"%s : ADDR = %d ,I = %.3f mA",I_SOA.Info,I_SOA.ADDR,I_SOA.Current_Target);HAL_Delay(5000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}

日志输出

ADN8810电流源的STM32驱动(HAL库)相关推荐

  1. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  2. STM32用HAL库移植LORA(SX1276)的2.1版本驱动教程

    网上多数是STM32标准库LORA驱动2.0.0的例程,在此小编移植STM32的HAL库2.1.0版本LORA驱动,,但是有丢包现象需要调节参数,用的模块是安信可Ra-01 SX1278 LoRa,如 ...

  3. 【STM32】HAL库 STM32CubeMX教程十四---SPI

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在我们的HAL库中,对硬件SPI函数做了很好的集成,使得之前SPI几百行代码,在HAL库中,只需 ...

  4. 【STM32】HAL库 STM32CubeMX教程十---DAC

    前言: 本系列教程将 对应外设原理,HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1.芯片: STM32F407ZET6/ STM32F103ZET6 ...

  5. 【STM32】HAL库 ——DAC

    前期准备: STM32CubeMX STM32RCT6核心板 IDE Keil(MDK-ARM) STM32CubeMX部分 1. 配置时钟 选择STM32F103RCTx系列芯片,配置时钟的同时会自 ...

  6. STM32的HAL库及其使用

    随着时代的逐步发展,联网.USB.文件系统.加密算法.RTOS.GUI等第三方组件变得越来越重要,简陋的标准库已经很难满足当代单片机开发需求了. 事实上,单片机开发在走PC.手机等以CPU为核心的产品 ...

  7. STM32的HAL库分析及使用

    STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配 ...

  8. STM32之HAL库详解 及 手动移植

    转载出处:http://blog.csdn.net/zcshoucsdn/article/details/55213616 HAL库结构   说到STM32的HAL库,就不得不提STM32CubeMX ...

  9. 【STM32】HAL库 STM32CubeMX教程十二---IIC(读取AT24C02 )

    前言: 本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 在之前的标准库中,STM32的硬件IIC非常复杂,更重要的是它并不稳定,所以都不推荐使用. 但是 ...

最新文章

  1. 软件测试培训:高薪测试技术要掌握哪些
  2. golang 字节切片 数组 字符串 互转
  3. 与Google用户帐户集成
  4. POJ2771最大独立集元素个数
  5. [hypervisor]-ARMV8的hypervisor技术介绍–InProgress
  6. android6.0源码分析之AMS服务源码分析
  7. python 编译函数_在Python的Django框架中编写编译函数
  8. 用MATLAB函数绘制系统的,用matlab绘制odes系统定义的函数
  9. HBase 2.0版本正式发布
  10. 一个简单的调用动态库的实例
  11. wifi信号桥怎么设置_扩展WiFi信号有什么好方法?路由器无线万能中继设置方法来了!...
  12. Linux-----进程获得进程号 获得父进程号 获得进程组号 getpid getppid getpgid
  13. 使用emacs作为mysql的客户端
  14. 微信小程序-样式-引入
  15. 月入3万多的程序员回老家, 被亲戚说不如县城卖手机月入2千的表弟
  16. 利用电脑玩android版天天连萌刷高分 二,利用计算机玩Android版“天天连萌”刷高分(二)——图像识别...
  17. 目录-中文版Excel 2016宝典(第9版)
  18. 这年头Windows电脑还需要杀毒软件吗?
  19. Win10无线网络图标不见了,看这一条就行。
  20. 用Dijkstra算法找到图上两点之间的最短路径

热门文章

  1. 手机数字基带处理芯片中的静态时序分析
  2. PFC 5.00.35中,如何去掉二维球形颗粒的黑色边框?很简单
  3. Premiere教程2
  4. ECharts实现全国空气质量查询
  5. C语言最重要的知识点【入门干货】
  6. 算法设计与分析选择题、简答题、证明题整理
  7. F2063 Could not compile usde unit ‘uniGUITypes‘问题解决
  8. violates Content Security Policy报错1
  9. Flex布局实战(1) 携程旅游
  10. 3使用高级元数据 ( yocto-kernel-cache)