当前位置: 代码网 > it编程>前端脚本>Python > ADS1256+STM32程序详解

ADS1256+STM32程序详解

2024年08月02日 Python 我要评论
void Init_ADS1256_GPIO(void){ GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_DRDY, ENABLE); GPIO_InitStructure.GPIO_Pin = PIN_DRDY; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50

               ads1256是ti公司推出的微功耗、高精度、8通道、24位高性能模数转换器(adc)。该器件提供高达23比特的无噪声精度、数据速率高达30ksps(次采样/秒)、十万分之一的非线性特性以及具备众输入模拟多路开关、输入缓冲器、可编程增益放大器和可编程数字滤波器等,,有完善的自校正和系统校正系统,spi串行数据传输接口。可为设计人员带来完整而高分辨率的量测解决方,如应变计、气体分析、仪器仪表、压力传感器、血液分析、医疗科学仪器等应用,ads1256采用ssop-2封装。

ads1256特点 

 1、8通道输入:可同时采集8路信号。 

 2、测量范围广:0-5v输入电压采样

 3、采集频率高,精度高:采集卡的采集速率为30k/s。 

ads1256示意图

1.  时序图

stm32spi可以直接连接,ads1256的cs线仅仅只是做片选使用数据输出结束需要发送一次脉冲。在sclk第一脉冲din开始接受数据输入,数据输入完毕的t6内sclk需要保持低电平,然后调制一个周期的脉冲信号,数据即可全部到达dout总线,一次读写完毕。

核心源码:


#include <stdio.h>
#include "stm32f10x_gpio.h"
#include "ads1256.h"


//***************************
//        pin assign           
//            stm32            ads1256        
//        gpiob_pin_11         <--- drdy
//        gpiob_pin_12         ---> cs
//        gpiob_pin_13         ---> sck
//        gpiob_pin_14(miso)  <--- dout
//        gpiob_pin_15(mosi)  ---> din
//***************************    

#define rcc_drdy            rcc_apb2periph_gpiob
#define port_drdy            gpiob
#define pin_drdy            gpio_pin_11

#define port_cs                gpiob
#define pin_cs                gpio_pin_12


#define cs_0()                gpio_resetbits(port_cs, pin_cs);
#define cs_1()                gpio_setbits(port_cs, pin_cs);
#define ads1256_drdy          (port_drdy->idr & pin_drdy)


void spi2_init(void)
{
 spi_inittypedef  spi_initstructure;
 gpio_inittypedef gpio_initstructure;
 /****initial spi2******************/
 
 /* enable spi2 and gpiob clocks */
 rcc_apb2periphclockcmd(rcc_apb2periph_gpiob, enable);

 rcc_apb1periphclockcmd(rcc_apb1periph_spi2, enable);
 /* configure spi2 pins: nss, sck, miso and mosi */
 gpio_initstructure.gpio_pin = gpio_pin_13 | gpio_pin_14 | gpio_pin_15;
 gpio_initstructure.gpio_speed = gpio_speed_50mhz;
 gpio_initstructure.gpio_mode = gpio_mode_af_pp;
 gpio_init(gpiob, &gpio_initstructure);
 
  /* spi2 configuration */ 
 spi_initstructure.spi_direction = spi_direction_2lines_fullduplex; //
 spi_initstructure.spi_mode = spi_mode_master;                    
 spi_initstructure.spi_datasize = spi_datasize_8b;              
 spi_initstructure.spi_cpol = spi_cpol_low;                   
 spi_initstructure.spi_cpha = spi_cpha_2edge;               
 spi_initstructure.spi_nss = spi_nss_soft;                 
 spi_initstructure.spi_baudrateprescaler = spi_baudrateprescaler_256; //
 spi_initstructure.spi_firstbit = spi_firstbit_msb;      
 spi_initstructure.spi_crcpolynomial = 7;       
 spi_init(spi2, &spi_initstructure);
 /* enable spi2  */
 spi_cmd(spi2, enable);  
}  


void init_ads1256_gpio(void)
{
    gpio_inittypedef gpio_initstructure;
    rcc_apb2periphclockcmd(rcc_drdy, enable); 

    gpio_initstructure.gpio_pin = pin_drdy; 
      gpio_initstructure.gpio_mode = gpio_mode_ipu;
      gpio_initstructure.gpio_speed = gpio_speed_50mhz;
      gpio_init(port_drdy, &gpio_initstructure);
     //spi2 nss 
    cs_1();
    gpio_initstructure.gpio_pin = pin_cs;
    gpio_initstructure.gpio_speed = gpio_speed_50mhz;
    gpio_initstructure.gpio_mode = gpio_mode_out_pp;
    gpio_init(port_cs, &gpio_initstructure);
     
    spi2_init();
}



unsigned char spi_writebyte(unsigned char txdata)
{
  unsigned char rxdata=0;
  while(spi_i2s_getflagstatus(spi2,spi_i2s_flag_txe)==reset);
  spi_i2s_senddata(spi2,txdata);
  while(spi_i2s_getflagstatus(spi2,spi_i2s_flag_rxne)==reset);
  rxdata=spi_i2s_receivedata(spi2);
  return rxdata;


void ads1256wreg(unsigned char regaddr,unsigned char databyte)
{
    
    cs_0();
    while(ads1256_drdy);

    spi_writebyte(ads1256_cmd_wreg | (regaddr & 0x0f));

    spi_writebyte(0x00);

    spi_writebyte(databyte);
    cs_1();
}


//³õê¼»¯ads1256
void ads1256_init(void)
{
    //*************×ôð£×¼****************
       while(ads1256_drdy);
    cs_0();
    spi_writebyte(ads1256_cmd_selfcal);
    while(ads1256_drdy);
    cs_1();
    //**********************************

    ads1256wreg(ads1256_status,0x06);               
//    ads1256wreg(ads1256_status,0x04);             

//    ads1256wreg(ads1256_mux,0x08);                 ¡¯
    ads1256wreg(ads1256_adcon,ads1256_gain_1);             
    ads1256wreg(ads1256_drate,ads1256_drate_10sps);  
    ads1256wreg(ads1256_io,0x00);               

    //*************************
    while(ads1256_drdy);
    cs_0();
    spi_writebyte(ads1256_cmd_selfcal);
    while(ads1256_drdy);
    cs_1(); 
    //**********************************
}

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com