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