热度 25
2013-8-22 22:09
2208 次阅读|
3 个评论
虽然一开始打算做的是四位半万用表,但是,我们的终极目标是用高档表—— 六位半,向经典表王——安捷伦34401A学习。所以,我思前想后,LT2440无疑是最好的选择,因为其是积分型ADC,温漂够小,但是其价格昂贵,所以我打算在后期六位半中使用,四位半试验阶段就用TI的ADS1232,同是24位ADC,但ADS1232的淘宝价格是12元,与LT2440的几十个大洋想比,还是很便宜的。 下面是ADS1232的STM32驱动程序。 #include"stm32f10x.h" #include"delay.h" #include"ads1232.h" extern unsigned char flag; #define DOUT GPIO_Pin_0 #define SCLK GPIO_Pin_1 #define PDWN GPIO_Pin_2 #define SPEED GPIO_Pin_3 #define GAIN0 GPIO_Pin_4 #define GAIN1 GPIO_Pin_5 #define A0 GPIO_Pin_6 #define ADPORT GPIOB #define DOUT_H GPIO_SetBits(ADPORT,DOUT) #define DOUT_L GPIO_ResetBits(ADPORT,DOUT) #define SCLK_H GPIO_SetBits(ADPORT,SCLK) #define SCLK_L GPIO_ResetBits(ADPORT,SCLK) #define SPEED_H GPIO_SetBits(ADPORT,SPEED) #define SPEED_L GPIO_ResetBits(ADPORT,SPEED) #define PDWN_H GPIO_SetBits(ADPORT,PDWN) #define PDWN_L GPIO_ResetBits(ADPORT,PDWN) #define A0_H GPIO_SetBits(ADPORT,A0) //AIN 2 #define A0_L GPIO_ResetBits(ADPORT,A0) //AIN 1 #define GAIN_1 GPIO_ResetBits(ADPORT,GAIN0|GAIN1); /**************************************************** *function name: void AD_InitIO(void) *description : AD GPIO Initialization,PB0-DOUT,PB1-SCLK *input : null *output : null *return £ºnull ******************************************************/ void AD_InitIO(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=SCLK; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(ADPORT,GPIO_InitStructure); } /**************************************************** *function name: void DOUT_IN(void) *description : ADS1232's DOUT PB0 config input *input : null *output : null *return £ºnull ******************************************************/ void DOUT_IN(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=DOUT; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //ÉÏÀÊäÈë GPIO_Init(ADPORT,GPIO_InitStructure); } /**************************************************** *function name: void DOUT_OUT(void) *description : ADS1232's DOUT PB0 config input *input : null *output : null *return £ºnull ******************************************************/ void DOUT_OUT(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); GPIO_InitStructure.GPIO_Pin=DOUT; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_Init(ADPORT,GPIO_InitStructure); } /**************************************************** *function name: unsigned long AD_read(void) *description : read AD data *input : null *output : null *return £ºnull ******************************************************/ unsigned long AD_read(unsigned char channel) { int i=0; unsigned long ad_value=0; AD_InitIO(); SCLK_L; PDWN_L; delay_us(20); if(channel == 1) { A0_L; //AIN1 } else { A0_H; //AIN2 } GAIN_1; SPEED_H; //80SPS PDWN_H; delay_us(20); // DOUT_OUT(); // DOUT_H; // delay_us(1); DOUT_IN(); while(GPIO_ReadInputDataBit(ADPORT,DOUT)==1); //delay_ms(200); flag=1; for(i=0;i24;i++) { ad_value=ad_value1; SCLK_H; delay_us(2); if(GPIO_ReadInputDataBit(ADPORT,DOUT)==1) { ad_value|=0x00000001; //or ad_value+=1; } else SCLK_L; delay_us(2); } SCLK_H; delay_us(2); SCLK_L; delay_ms(1); return ad_value; }