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