基于STM32的ADS1230驱动例程

发布于:2025-02-12 ⋅ 阅读:(16) ⋅ 点赞:(0)

自己在练手项目中用到了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);
}