自己在练手项目中用到了ADS1230,根据芯片手册自写的驱动代码,已测可用,希望对将要用到ADS1230芯片的人有所帮助。
芯片:STM32系列任意芯片、ADS1230
环境:使用STM32CubeMX配置引脚、KEIL
部分电路:
代码:
ads1230.h
#ifndef __ADS1230_H__
#define __ADS1230_H__#include "gpio.h"// 移植时改为对应引脚即可
// 控制AD开关 (PDWN引脚)
#define AD_ON() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_SET)
#define AD_OFF() HAL_GPIO_WritePin(GPIOA,GPIO_PIN_8,GPIO_PIN_RESET)// 控制数据传输速率(SPEED引脚)
#define AD_SPEED_H() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET)
#define AD_SPEED_L() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET)// 控制时钟信号(SCLK引脚)
#define ADS1_CLK_H() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_SET)
#define ADS1_CLK_L() HAL_GPIO_WritePin(GPIOB,GPIO_PIN_3,GPIO_PIN_RESET)// 读一位数据(DOUT引脚)
#define ADS1_RD_DATA HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)// 获取当前mv值
void readADS1230(double* signal_mv); #endif
ads1230.c
#include "ads1230.h"
#include "main.h"
void readADS1230(double* signal_mv)
{int ADdatatemp1=0; uint8_t mv1_flag = 0 ; // 用来判断正负的标志位while(ADS1_RD_DATA); // 等待数据准备好for(uint8_t i = 0;i < 20;i ++) // 读取20位数据 {ADdatatemp1 = ADdatatemp1 << 1;ADS1_CLK_H(); // 发送一个时钟信号ADS1_CLK_L(); if( i == 0 ) // 读第一位数据,判断正负{if(ADS1_RD_DATA) {ADdatatemp1 ++;mv1_flag++;}ADdatatemp1 = ADdatatemp1 << 11;}else{if(mv1_flag){if(!ADS1_RD_DATA) {ADdatatemp1 ++;}}else{if(ADS1_RD_DATA) {ADdatatemp1 ++;}} }} if(!mv1_flag)ADdatatemp1++; // 负数最后要加1for(uint8_t i=0;i<6;i++) // 额外发送6个时钟信号用来校准{ADS1_CLK_H();ADS1_CLK_L();}*signal_mv =( 19.53125f / 524287.0f )*ADdatatemp1; // 计算mv值return;
}
使用方法:
// 设置传输速率,AD_SPEED_H()快;AD_SPEED_L()慢
AD_SPEED_H(); // 启动AD转换
AD_ON(); // 读取mv值
double signal_mv = 0.00f;
while(1)
{readADS1230(&signal_mv);// printf("-- 当前mv值 %.4f --\n",signal_mv);
}