ADS1118 STM32模拟spi驱动(HAL)

1 篇文章 0 订阅
1 篇文章 0 订阅
#ifndef _ADS1118_SPI_H
#define _ADS1118_SPI_H

#define ADS1118CS_AIN0	0xC38B			//量程0-4.096v
#define ADS1118CS_AIN1	0xD38B			//量程0-4.096v
#define ADS1118CS_AIN2	0xE38B			//量程0-4.096v
#define ADS1118CS_AIN3	0xF38B			//量程0-4.096v

/*
* CS配置为推挽输出模式
* CLK配置推挽输出模式
* MOSI配置为推挽输出
* DOUT配置为输入模式
*/
/** ADS1118对应的引脚高低配置宏定义*/
#define ADS1118_CS1_SET()			HAL_GPIO_WritePin(ADS1118_CS1_GPIO_Port, ADS1118_CS1_Pin, GPIO_PIN_SET)
#define ADS1118_CS1_RESET()			HAL_GPIO_WritePin(ADS1118_CS1_GPIO_Port, ADS1118_CS1_Pin, GPIO_PIN_RESET)
#define ADS1118_CS2_SET()			HAL_GPIO_WritePin(ADS1118_CS2_GPIO_Port, ADS1118_CS2_Pin, GPIO_PIN_SET)
#define ADS1118_CS2_RESET()			HAL_GPIO_WritePin(ADS1118_CS2_GPIO_Port, ADS1118_CS2_Pin, GPIO_PIN_RESET)
#define ADS1118_CS3_SET()			HAL_GPIO_WritePin(ADS1118_CS3_GPIO_Port, ADS1118_CS3_Pin, GPIO_PIN_SET)
#define ADS1118_CS3_RESET()			HAL_GPIO_WritePin(ADS1118_CS3_GPIO_Port, ADS1118_CS3_Pin, GPIO_PIN_RESET)

#define ADS1118_CLK_SET()			HAL_GPIO_WritePin(ADS1118_SCLK_GPIO_Port, ADS1118_SCLK_Pin, GPIO_PIN_SET)
#define ADS1118_CLK_RESET()			HAL_GPIO_WritePin(ADS1118_SCLK_GPIO_Port, ADS1118_SCLK_Pin, GPIO_PIN_RESET)

#define ADS1118_MOSI_SET()			HAL_GPIO_WritePin(ADS1118_DIN_GPIO_Port, ADS1118_DIN_Pin, GPIO_PIN_SET)
#define ADS1118_MOSI_RESET()		HAL_GPIO_WritePin(ADS1118_DIN_GPIO_Port, ADS1118_DIN_Pin, GPIO_PIN_RESET)

#define ADS1118_DOUT_SET()			HAL_GPIO_WritePin(ADS1118_DOUT_GPIO_Port, ADS1118_DOUT_Pin, GPIO_PIN_SET)

#define ADS1118_DOUT_Pin_READ()	    HAL_GPIO_ReadPin(ADS1118_DOUT_GPIO_Port, ADS1118_DOUT_Pin)

void ADS1118_Init(void); /**< ADS1118初始化 */
void ADS1118_Main(void); /**< ADS1118读取函数 */
float ResToTemp_NTC(float res,uint8_t ResType); /**< 电压值转换为温度值 */
float GetADS1118Voltage(const uint16_t config,const uint16_t config1); /**< 获取ADS1118对应通道电压值 */ 

#endif
#include "main.h"
#include <math.h>
#include "delay.h"
#include "ADS1118.h"

float read_vol_buf[8];//读取两块芯片八个通道的电压值存放数组

unsigned int ADS1118_ReadWrite16Bit(unsigned int cmd)
{
    unsigned char i;
    unsigned int read_data = 0;

    for(i = 0; i < 16; i++)
    {
        delay_us(1);
        ADS1118_CLK_SET();
        delay_us(1);
        read_data <<= 1;
        if(ADS1118_DOUT_Pin_READ() == SET)
        {
            read_data |= 1;
        }
        if(cmd & 0x8000)
        {
            ADS1118_MOSI_SET();
        }
        else
        {
            ADS1118_MOSI_RESET();
        }
        cmd <<= 1;
        ADS1118_CLK_RESET();
    }
    return read_data;
}

float GetADS1118Voltage(const unsigned int config_now, const unsigned int config_next)
{
    float voltage_val = 0.0f;//采集到的电压值
    float VoltageK = 4.096f;//采集到的电压值,会根据你配置的config_now变量值自行转换量程
    unsigned int DataRx = 0;//读取转换后的值
    unsigned int count = 0;

    count = 10000;
    while(ADS1118_DOUT_Pin_READ() == SET && --count > 0)//等待转换完毕
    {
        delay_us(1);
    }
    DataRx = ADS1118_ReadWrite16Bit(config_next);//转换寄存器数据
    ADS1118_ReadWrite16Bit(config_next);         //配置寄存器数据

    switch((config_now>>9)&0x07)
    {
    case 0:
        VoltageK = 6.144f;
        break;
    case 1:
        VoltageK = 4.096f;
        break;
    case 2:
        VoltageK = 2.048f;
        break;
    case 3:
        VoltageK = 1.024f;
        break;
    case 4:
        VoltageK = 0.512f;
        break;
    default:
        VoltageK = 0.128f;
        break;
    }
    if( DataRx&0x8000 ) DataRx=0;		     //负电压置0
    voltage_val = DataRx * VoltageK / 65536;	 //获得实际电压
    voltage_val *= 2;

    return voltage_val;
}

void ADS1118_Init(void)
{
    //设置ADS1118_CS1初始化
    ADS1118_CS2_SET();
    ADS1118_CS3_SET();
    ADS1118_CS1_RESET();
    delay_us(1);
    ADS1118_ReadWrite16Bit(ADS1118CS_AIN0);
    ADS1118_CS1_SET();

    //设置ADS1118_CS2初始化
    ADS1118_CS2_RESET();
    delay_us(1);
    ADS1118_ReadWrite16Bit(ADS1118CS_AIN0);
    ADS1118_CS2_SET();

    if(sys_status.testFlag == 1)//仅非测试模式进行采集,降低采集时间
    {
        //设置ADS1118_CS3初始化
        ADS1118_CS3_RESET();
        delay_us(1);
        ADS1118_ReadWrite16Bit(VSEL_I_SET_Channel);
        ADS1118_CS3_SET();
    }

    ADS1118_Main(); //读取一次数据
}

void ADS1118_Main(void)
{
    unsigned int index = 0;
    //第1块ADS1118/
    ADS1118_CS2_SET();
    ADS1118_CS1_RESET();
    delay_us(1);
    ADS1118_ReadWrite16Bit(ADS1118CS_AIN0);//配置下次读取的通道
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN0, ADS1118CS_AIN1);//开始读取通道0,并配置下次读取通道1
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN1, ADS1118CS_AIN2);//开始读取通道1,并配置下次读取通道2
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN2, ADS1118CS_AIN3);//开始读取通道2,并配置下次读取通道3
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN3, ADS1118CS_AIN0);//开始读取通道3,并配置下次读取通道4
    ADS1118_CS1_SET();

    //第2块ADS1118/
    ADS1118_CS2_RESET();
    delay_us(1);
    ADS1118_ReadWrite16Bit(ADS1118CS_AIN0);//配置下次读取的通道
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN0, ADS1118CS_AIN1);//开始读取通道0,并配置下次读取通道1
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN1, ADS1118CS_AIN2);//开始读取通道1,并配置下次读取通道2
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN2, ADS1118CS_AIN3);//开始读取通道2,并配置下次读取通道3
    read_vol_buf[index++] = GetADS1118Voltage(ADS1118CS_AIN3, ADS1118CS_AIN0);//开始读取通道3,并配置下次读取通道4
    ADS1118_CS2_SET();
}

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值