#include "H/Function_Init.H" //ADC引脚命名 #define ADC_DT0 P44 #define ADC_CLK0 P43 #define ADC_DT1 P05 #define ADC_CLK1 P04 #define ADC_DT2 P26 #define ADC_CLK2 P25 #define ADC_DT3 P02 #define ADC_CLK3 P01 //DOUT方向设置 #define ADC_DT0_IN() {P4CON &= 0xEF;P4PH|=0x10;} #define ADC_DT0_OUT() {P4CON |= 0X10;} #define ADC_DT1_IN() { P0CON &= 0xDF;P0PH|=0x20;} #define ADC_DT1_OUT() { P0CON |= 0x20;} #define ADC_DT2_IN() { P2CON &= 0xBF;P2PH|=0x40;} #define ADC_DT2_OUT() { P2CON |= 0x40;} #define ADC_DT3_IN() {P0CON &= 0xFB;P0PH|=0x04;} #define ADC_DT3_OUT() {P0CON |= 0x04;} void CS1237_Init_all(void) { CS1237_Init();//CS1237初始化 CS1237_Init_1(); CS1237_Init_2(); CS1237_Init_3(); } void CS1237_Config_all(void) { CS1237_Config(); CS1237_Config_1(); CS1237_Config_2(); CS1237_Config_3(); } long Read_CS1237_all(uchar num) { long ret; switch(num) { case 0:ret = Read_CS1237();break; case 1:ret = Read_CS1237_1();break; case 2:ret = Read_CS1237_2();break; case 3:ret = Read_CS1237_3();break; default:ret = 0;break; } return ret; } /************************************************************** ADC芯片说明: 1、PAG放大倍数选择需要根据输入的模拟型号的最大电压值来确定,灵敏度乘以激励电压就是最大输出; 2、非线性,滞后性,重复性归结为综合误差,一般用%F*S来表示,就是占最大输出电压的百分比; 3、设置输出速率之前,超时时间等长一点,不然可能会超时; ***************************************************************/ //////////////初始化CS1237芯片,先拉高clk进入PowerDown状态 void CS1237_Init(void) { ADC_DT0_OUT(); ADC_DT0 = 1; ADC_CLK0 = 1; } //////////////配置CS1237芯片 uchar CS1237_Config(void) { uchar i ; uchar dat ; uint count_i = 0; dat =0x0c;//芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C // ADC_DT0_OUT(); // ADC_DT0 = 1; ADC_DT0_IN(); ADC_CLK0 = 0; // UART_SendByte(0x22); while(ADC_DT0 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT0_OUT(); ADC_CLK0 = 1; ADC_DT0 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK0=1; Delay(1); ADC_CLK0=0; Delay(1); } ADC_DT0_OUT(); /////////////////30-36写配置寄存器命令7bit 0X65 ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); /////////////////37切换方向 ADC_CLK0 = 1; Delay(1); ADC_CLK0 = 0; Delay(1); /////////////////38-45 写8位数据,配置参数 for(i=0;i<8;i++) { ADC_CLK0 = 1; Delay(1); if(dat&0x80) ADC_DT0=1; else ADC_DT0=0; dat<<=1; ADC_CLK0 = 0; Delay(1); } ADC_CLK0 = 1;//46 ADC_DT0 = 1 ; Delay(1); ADC_CLK0 = 0; Delay(1); return 1; } //////////////读芯片输出数据 long Read_CS1237(void) { uchar i; unsigned long dat = 0;//读到的数据 uint count_i = 0;//溢出计时器 long temp; // ADC_DT0_OUT(); // ADC_DT0 = 1; ADC_DT0_IN(); ADC_CLK0 = 0; while(ADC_DT0==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT0_OUT(); ADC_CLK0 = 1; ADC_DT0 = 1; return 0; } } dat = 0; for(i=0;i<24;i++) { ADC_CLK0 = 1; Delay(1); dat<<=1; if(ADC_DT0==1) dat++; ADC_CLK0 = 0; Delay(1); } for(i=0;i<3;i++)//接着前面24个时钟后等3个时钟,DOUT会主动拉高1次 { ADC_CLK0=1; Delay(1); ADC_CLK0=0; Delay(1); } ADC_DT0_OUT(); ADC_DT0=1; Delay(1); ADC_DT0_IN(); if(dat &0x00800000)//24位补码转32位,负数需要按位取反(除符号位),再+1转源码后,填充符号位 { temp = -(((~dat)&0x007FFFFF)+1); } else temp = dat; return temp; } //////////////读芯片配置数据 uchar Read_Config(void) { uchar i; uchar dat = 0;//读到的数据 uint count_i = 0;//超时溢出计时器 // ADC_DT0_OUT(); // ADC_DT0 = 1; ADC_DT0_IN(); ADC_CLK0 = 0; // UART_SendByte(0x22); while(ADC_DT0 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT0_OUT(); ADC_CLK0 = 1; ADC_DT0 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK0=1; Delay(1); ADC_CLK0=0; Delay(1); } ADC_DT0_OUT(); /////////////////30-36读配置寄存器命令7bit 0X56 ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=1;ADC_CLK0=0;Delay(1); ADC_CLK0 = 1;Delay(1);ADC_DT0=0;ADC_CLK0=0;Delay(1); /////////////////37切换方向 ADC_CLK0 = 1; Delay(1); ADC_DT0_IN(); ADC_CLK0 = 0; Delay(1); dat = 0; for(i=0;i<8;i++)/////////38-45,读寄存器配置 { ADC_CLK0 = 1; Delay(1); ADC_CLK0 = 0; Delay(1); dat<<=1; if(ADC_DT0==1) dat++; } ADC_CLK0 = 1;//46 Delay(1); ADC_DT0_OUT(); ADC_DT0=1; ADC_CLK0 = 0; Delay(1); return dat; } //////////////初始化CS1237芯片,先拉高clk进入PowerDown状态 void CS1237_Init_1(void) { ADC_DT1_OUT(); ADC_DT1 = 1; ADC_CLK1 = 1; } //////////////配置CS1237芯片 uchar CS1237_Config_1(void) { uchar i ; uchar dat ; uint count_i = 0; dat =0x0c;//芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C ADC_DT1_OUT(); ADC_DT1 = 1; ADC_DT1_IN(); ADC_CLK1 = 0; // UART_SendByte(0x22); while(ADC_DT1 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT1_OUT(); ADC_CLK1 = 1; ADC_DT1 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK1=1; Delay(1); ADC_CLK1=0; Delay(1); } ADC_DT1_OUT(); /////////////////30-36写配置寄存器命令7bit 0X65 ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); /////////////////37切换方向 ADC_CLK1 = 1; Delay(1); ADC_CLK1 = 0; Delay(1); /////////////////38-45 写8位数据,配置参数 for(i=0;i<8;i++) { ADC_CLK1 = 1; Delay(1); if(dat&0x80) ADC_DT1=1; else ADC_DT1=0; dat<<=1; ADC_CLK1 = 0; Delay(1); } ADC_CLK1 = 1;//46 ADC_DT1 = 1 ; Delay(1); ADC_CLK1 = 0; Delay(1); return 1; } //////////////读芯片输出数据 long Read_CS1237_1(void) { uchar i; unsigned long dat = 0;//读到的数据 uint count_i = 0;//溢出计时器 long temp; // ADC_DT1_OUT(); // ADC_DT1 = 1; ADC_DT1_IN(); ADC_CLK1 = 0; while(ADC_DT1==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT1_OUT(); ADC_CLK1 = 1; ADC_DT1 = 1; return 0; } } dat = 0; for(i=0;i<24;i++) { ADC_CLK1 = 1; Delay(1); dat<<=1; if(ADC_DT1==1) dat++; ADC_CLK1 = 0; Delay(1); } for(i=0;i<3;i++)//接着前面24个时钟后等3个时钟,DOUT会主动拉高1次 { ADC_CLK1=1; Delay(1); ADC_CLK1=0; Delay(1); } ADC_DT1_OUT(); ADC_DT1=1; Delay(1); ADC_DT1_IN(); if(dat &0x00800000)//24位补码转32位,负数需要按位取反(除符号位),再+1转源码后,填充符号位 { temp = -(((~dat)&0x007FFFFF)+1); } else temp = dat; return temp; } //////////////读芯片配置数据 uchar Read_Config_1(void) { uchar i; uchar dat = 0;//读到的数据 uint count_i = 0;//超时溢出计时器 ADC_DT1_OUT(); ADC_DT1 = 1; ADC_DT1_IN(); ADC_CLK1 = 0; // UART_SendByte(0x22); while(ADC_DT1 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT1_OUT(); ADC_CLK1 = 1; ADC_DT1 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK1=1; Delay(1); ADC_CLK1=0; Delay(1); } ADC_DT1_OUT(); /////////////////30-36读配置寄存器命令7bit 0X56 ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=1;ADC_CLK1=0;Delay(1); ADC_CLK1 = 1;Delay(1);ADC_DT1=0;ADC_CLK1=0;Delay(1); /////////////////37切换方向 ADC_CLK1 = 1; Delay(1); ADC_DT1_IN(); ADC_CLK1 = 0; Delay(1); dat = 0; for(i=0;i<8;i++)/////////38-45,读寄存器配置 { ADC_CLK1 = 1; Delay(1); ADC_CLK1 = 0; Delay(1); dat<<=1; if(ADC_DT1==1) dat++; } ADC_CLK1 = 1;//46 Delay(1); ADC_DT1_OUT(); ADC_DT1=1; ADC_CLK1 = 0; Delay(1); return dat; } //////////////初始化CS1237芯片,先拉高clk进入PowerDown状态 void CS1237_Init_2(void) { ADC_DT2_OUT(); ADC_DT2 = 1; ADC_CLK2 = 1; } //////////////配置CS1237芯片 uchar CS1237_Config_2(void) { uchar i ; uchar dat ; uint count_i = 0; dat =0x0c;//芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C // ADC_DT2_OUT(); // ADC_DT2 = 1; ADC_DT2_IN(); ADC_CLK2 = 0; // UART_SendByte(0x22); while(ADC_DT2 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT2_OUT(); ADC_CLK2 = 1; ADC_DT2 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK2=1; Delay(1); ADC_CLK2=0; Delay(1); } ADC_DT2_OUT(); /////////////////30-36写配置寄存器命令7bit 0X65 ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); /////////////////37切换方向 ADC_CLK2 = 1; Delay(1); ADC_CLK2 = 0; Delay(1); /////////////////38-45 写8位数据,配置参数 for(i=0;i<8;i++) { ADC_CLK2 = 1; Delay(1); if(dat&0x80) ADC_DT2=1; else ADC_DT2=0; dat<<=1; ADC_CLK2 = 0; Delay(1); } ADC_CLK2 = 1;//46 ADC_DT2 = 1 ; Delay(1); ADC_CLK2 = 0; Delay(1); return 1; } //////////////读芯片输出数据 long Read_CS1237_2(void) { uchar i; unsigned long dat = 0;//读到的数据 uint count_i = 0;//溢出计时器 long temp; // ADC_DT2_OUT(); // ADC_DT2 = 1; ADC_DT2_IN(); ADC_CLK2 = 0; while(ADC_DT2==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT2_OUT(); ADC_CLK2 = 1; ADC_DT2 = 1; return 0; } } dat = 0; for(i=0;i<24;i++) { ADC_CLK2 = 1; Delay(1); dat<<=1; if(ADC_DT2==1) dat++; ADC_CLK2 = 0; Delay(1); } for(i=0;i<3;i++)//接着前面24个时钟后等3个时钟,DOUT会主动拉高1次 { ADC_CLK2=1; Delay(1); ADC_CLK2=0; Delay(1); } ADC_DT2_OUT(); ADC_DT2=1; Delay(1); ADC_DT2_IN(); if(dat &0x00800000)//24位补码转32位,负数需要按位取反(除符号位),再+1转源码后,填充符号位 { temp = -(((~dat)&0x007FFFFF)+1); } else temp = dat; return temp; } //////////////读芯片配置数据 uchar Read_Config_2(void) { uchar i; uchar dat = 0;//读到的数据 uint count_i = 0;//超时溢出计时器 ADC_DT2_OUT(); ADC_DT2 = 1; ADC_DT2_IN(); ADC_CLK2 = 0; // UART_SendByte(0x22); while(ADC_DT2 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT2_OUT(); ADC_CLK2 = 1; ADC_DT2 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK2=1; Delay(1); ADC_CLK2=0; Delay(1); } ADC_DT2_OUT(); /////////////////30-36读配置寄存器命令7bit 0X56 ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=1;ADC_CLK2=0;Delay(1); ADC_CLK2 = 1;Delay(1);ADC_DT2=0;ADC_CLK2=0;Delay(1); /////////////////37切换方向 ADC_CLK2 = 1; Delay(1); ADC_DT2_IN(); ADC_CLK2 = 0; Delay(1); dat = 0; for(i=0;i<8;i++)/////////38-45,读寄存器配置 { ADC_CLK2 = 1; Delay(1); ADC_CLK2 = 0; Delay(1); dat<<=1; if(ADC_DT2==1) dat++; } ADC_CLK2 = 1;//46 Delay(1); ADC_DT2_OUT(); ADC_DT2=1; ADC_CLK2 = 0; Delay(1); return dat; } //////////////初始化CS1237芯片,先拉高clk进入PowerDown状态 void CS1237_Init_3(void) { ADC_DT3_OUT(); ADC_DT3 = 1; ADC_CLK3 = 1; } //////////////配置CS1237芯片 uchar CS1237_Config_3(void) { uchar i ; uchar dat ; uint count_i = 0; dat =0x0c;//芯片地配置 内部REF 输出40HZ PGA=128 通道A 0X1C ADC_DT3_OUT(); ADC_DT3 = 1; ADC_DT3_IN(); ADC_CLK3 = 0; // UART_SendByte(0x22); while(ADC_DT3 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT3_OUT(); ADC_CLK3 = 1; ADC_DT3 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK3=1; Delay(1); ADC_CLK3=0; Delay(1); } ADC_DT3_OUT(); /////////////////30-36写配置寄存器命令7bit 0X65 ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); /////////////////37切换方向 ADC_CLK3 = 1; Delay(1); ADC_CLK3 = 0; Delay(1); /////////////////38-45 写8位数据,配置参数 for(i=0;i<8;i++) { ADC_CLK3 = 1; Delay(1); if(dat&0x80) ADC_DT3=1; else ADC_DT3=0; dat<<=1; ADC_CLK3 = 0; Delay(1); } ADC_CLK3 = 1;//46 ADC_DT3 = 1 ; Delay(1); ADC_CLK3 = 0; Delay(1); return 1; } //////////////读芯片输出数据 long Read_CS1237_3(void) { uchar i; unsigned long dat = 0;//读到的数据 uint count_i = 0;//溢出计时器 long temp; ADC_DT3_OUT(); ADC_DT3 = 1; ADC_DT3_IN(); ADC_CLK3 = 0; while(ADC_DT3==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT3_OUT(); ADC_CLK3 = 1; ADC_DT3 = 1; return 0; } } dat = 0; for(i=0;i<24;i++) { ADC_CLK3 = 1; Delay(1); dat<<=1; if(ADC_DT3==1) dat++; ADC_CLK3 = 0; Delay(1); } for(i=0;i<3;i++)//接着前面24个时钟后等3个时钟,DOUT会主动拉高1次 { ADC_CLK3=1; Delay(1); ADC_CLK3=0; Delay(1); } ADC_DT3_OUT(); ADC_DT3=1; Delay(1); ADC_DT3_IN(); if(dat &0x00800000)//24位补码转32位,负数需要按位取反(除符号位),再+1转源码后,填充符号位 { temp = -(((~dat)&0x007FFFFF)+1); } else temp = dat; return temp; } //////////////读芯片配置数据 uchar Read_Config_3(void) { uchar i; uchar dat = 0;//读到的数据 uint count_i = 0;//超时溢出计时器 // ADC_DT3_OUT(); // ADC_DT3 = 1; ADC_DT3_IN(); ADC_CLK3 = 0; // UART_SendByte(0x22); while(ADC_DT3 ==1) { Delay1ms(); count_i++; if(count_i>350) { ADC_DT3_OUT(); ADC_CLK3 = 1; ADC_DT3 = 1; return 0; //超时,退出程序 } } for(i=0;i<29;i++)//1-29 { ADC_CLK3=1; Delay(1); ADC_CLK3=0; Delay(1); } ADC_DT3_OUT(); /////////////////30-36读配置寄存器命令7bit 0X56 ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=1;ADC_CLK3=0;Delay(1); ADC_CLK3 = 1;Delay(1);ADC_DT3=0;ADC_CLK3=0;Delay(1); /////////////////37切换方向 ADC_CLK3 = 1; Delay(1); ADC_DT3_IN(); ADC_CLK3 = 0; Delay(1); dat = 0; for(i=0;i<8;i++)/////////38-45,读寄存器配置 { ADC_CLK3 = 1; Delay(1); ADC_CLK3 = 0; Delay(1); dat<<=1; if(ADC_DT3==1) dat++; } ADC_CLK3 = 1;//46 Delay(1); ADC_DT3_OUT(); ADC_DT3=1; ADC_CLK3 = 0; Delay(1); return dat; }