公司網(wǎng)站制作推廣公司
自己在練手項目中用到了ADS1230,根據(jù)芯片手冊自寫的驅(qū)動代碼,已測可用,希望對將要用到ADS1230芯片的人有所幫助。
芯片:STM32系列任意芯片、ADS1230
環(huán)境:使用STM32CubeMX配置引腳、KEIL
部分電路:
代碼:
ads1230.h
#ifndef __ADS1230_H__
#define __ADS1230_H__#include "gpio.h"// 移植時改為對應(yīng)引腳即可
// 控制AD開關(guān) (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)// 控制數(shù)據(jù)傳輸速率(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)// 讀一位數(shù)據(jù)(DOUT引腳)
#define ADS1_RD_DATA HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_4)// 獲取當(dāng)前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); // 等待數(shù)據(jù)準備好for(uint8_t i = 0;i < 20;i ++) // 讀取20位數(shù)據(jù) {ADdatatemp1 = ADdatatemp1 << 1;ADS1_CLK_H(); // 發(fā)送一個時鐘信號ADS1_CLK_L(); if( i == 0 ) // 讀第一位數(shù)據(jù),判斷正負{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++; // 負數(shù)最后要加1for(uint8_t i=0;i<6;i++) // 額外發(fā)送6個時鐘信號用來校準{ADS1_CLK_H();ADS1_CLK_L();}*signal_mv =( 19.53125f / 524287.0f )*ADdatatemp1; // 計算mv值return;
}
使用方法:
// 設(shè)置傳輸速率,AD_SPEED_H()快;AD_SPEED_L()慢
AD_SPEED_H(); // 啟動AD轉(zhuǎn)換
AD_ON(); // 讀取mv值
double signal_mv = 0.00f;
while(1)
{readADS1230(&signal_mv);// printf("-- 當(dāng)前mv值 %.4f --\n",signal_mv);
}