自己在练手项目中用到了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++; // 负数最后要加1
for(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);
}