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(); 
     //**********************************
 }
 
             我要评论
我要评论 
                                             
                                             
                                             
                                            
发表评论