24bit ADC芯片 CS1237完整驅動,實測可用無bug,只需修改IO口定義、移植IO口拉高拉低函數、定時器函數即可使用,簡單方便快捷。
0.png (4.99 KB, 下載次數: 177)
下載附件
2018-8-24 17:43 上傳
單片機源程序如下:
- /*****************************************
- * CS1237 designed by Robert Lee *
- * *
- *****************************************/
- #include "bsp.h"
- #include "common.h"
- //#ifdef USER_CS1237
- #define ADC_Bit 24 //ADC有效位數,帶符號位 最高24位
- #define SCK_1 SetGpio(10, 0)
- #define SCK_0 ClearGpio(10, 0)
- #define DAT_1 SetGpio(10, 1)
- #define DAT_0 ClearGpio(10, 1)
- #define NOP_5() __asm {nop};__asm {nop};__asm {nop}
- #define NOP30() NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
- #define NOP40() NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();NOP_5();
- #define One_CLK SCK_1;NOP40();SCK_0;NOP40();
- #define CS_CON 0X00 //芯片地配置 內部REF 輸出10HZ PGA=1 通道A 0X00
- #define Lv_Bo 0.01 //濾波系數 小于1
- //sbit DOUT = P3^7;//數據對應IO口
- //sbit SCLK = P3^5;//時鐘對應IO口
- static long AD_Res_Last=0;//上一輪的ADC數值保存
- //延時500US 5.5296MHZ
- void delay_500us(volatile unsigned char a)
- {
- volatile unsigned char i,j,b;
- for(b=0;b<a;b++)
- {
- i = 3;
- j = 137;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- //CS1237進入低功耗模式
- void CS1237_Power_Down(void)
- {
- //SCLK = 1;
- SCK_1;
- delay_500us(100);
- //SCLK = 1;
- SCK_1;
- //SCLK = 1;
- SCK_1;
- delay_500us(100);
- }
- //配置CS1237芯片
- void Con_CS1237(void)
- {
- unsigned char i;
- unsigned char dat;
- unsigned short count_i=0;//溢出計時器
- SetPinMux(10, 0, 0);//SCK
- SetPinMux(10, 1, 0);//SDA
- SetPinDir(10,0,1);
- SetPinDir(10,1,0);
-
- dat = CS_CON;// 0100 1000
- SCK_0;//時鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準備好數據輸出 時鐘已經為0,數據也需要等CS1237全部拉低為0才算都準備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 15000)
- {
- SCK_1;
- DAT_1;
- printf("here error\r\n");
- return;//超時,則直接退出程序
- }
- }
- for(i=0;i<29;i++)// 1 - 29
- {
- One_CLK;
- }
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//31
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//32
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//35
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//36
- One_CLK;//37 寫入了0x65
- for(i=0;i<8;i++)// 38 - 45個脈沖了,寫8位數據
- {
- SCK_1;NOP40();
- if(dat&0x80)
- DAT_1;
- else
- DAT_0;
- dat <<= 1;
- SCK_0;NOP40();
- }
- One_CLK;//46個脈沖拉高數據引腳
- }
- //讀取芯片的配置數據
- unsigned char Read_CON(void)
- {
- unsigned char i;
- unsigned char dat=0;//讀取到的數據
- unsigned short count_i=0;//溢出計時器
- unsigned char k=0,j=0;//中間變量
- SCK_0;//時鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準備好數據輸出 時鐘已經為0,數據也需要等CS1237全部拉低為0才算都準備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 15000)
- {
- SCK_1;
- DAT_1;
- printf("here outtime error\r\n");
- return 1;//超時,則直接退出程序
- }
- }
- for(i=0;i<29;i++)// 1 - 29
- {
- One_CLK;
- }
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//30
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//31
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//32
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//33
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//34
- SCK_1;NOP30();DAT_1;SCK_0;NOP30();//35
- SCK_1;NOP30();DAT_0;SCK_0;NOP30();//36
- DAT_1;
- One_CLK;//37 寫入了0x56
- dat=0;
- for(i=0;i<8;i++)// 38 - 45個脈沖了,讀取數據
- {
- One_CLK;
- dat <<= 1;
- if(ReadGpio(10,1) ==1)
- dat++;
- }
- One_CLK;//46個脈沖拉高數據引腳
- return dat;
- }
- //讀取ADC數據,返回的是一個有符號數據
- long Read_CS1237(void)
- {
- unsigned char i;
- long dat=0;//讀取到的數據
- unsigned char count_i=0;//溢出計時器
- // DOUT = 1;//端口鎖存1,51必備
- SCK_0;//時鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準備好數據輸出 時鐘已經為0,數據也需要等CS1237拉低為0才算都準備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 300)
- {
- SCK_1;
- DAT_1;
- printf("Read_CS1237 outtime error\r\n");
- return 0;//超時,則直接退出程序
- }
- }
- // DOUT = 1;//端口鎖存1,51必備
- dat=0;
- for(i=0;i<24;i++)//獲取24位有效轉換
- {
- SCK_1;
- NOP40();
- dat <<= 1;
- if(ReadGpio(10,1) ==1)
- dat ++;
- SCK_0;
- NOP40();
- }
- for(i=0;i<3;i++)//一共輸入27個脈沖
- {
- One_CLK;
- }
- //DAT_1;
- //先根據宏定義里面的有效位,丟棄一些數據
- i = 24 - ADC_Bit;//i表示將要丟棄的位數
- dat >>= i;//丟棄多余的位數
- return dat;
- }
- //初始化ADC相關參數
- void Init_CS1237(void)
- {
- Con_CS1237();//配置CS1237
- if(Read_CON() != CS_CON)//如果讀取的ADC配置出錯,則重啟
- {
- printf("Init_CS1237 error\r\n");
- }
- //IAP_CONTR = 0x20;
- //AD_Res_Last = Read_CS1237();
- //AD_Res_Last = Read_CS1237();
- //AD_Res_Last = Read_CS1237();
- //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
- }
- //數字一階濾波器 濾波系數A,小于1。上一次數值B,本次數值C out = b*A + C*(1-A)
- //下面這個程序負責讀取出最終ADC數據
- long Read_12Bit_AD(void)
- {
- float out,c;
-
- out = AD_Res_Last;
- c = Read_CS1237();
- if(out !=0 && (out<c*0.8 || out>c*1.2))
- c = out;
- if(c!=0) // 讀到正確數據
- {
- out = out*Lv_Bo + c*(1-Lv_Bo);
- AD_Res_Last = out;//把這次的計算結果放到全局變量里面保護
- }
- //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
- return AD_Res_Last;
- }
- //#endif
復制代碼
所有資料51hei提供下載:
cs1237驅動.rar
(2.25 KB, 下載次數: 744)
2018-8-24 11:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|