|
24bit ADC芯片 CS1237完整驅(qū)動(dòng),實(shí)測(cè)可用無(wú)bug,只需修改IO口定義、移植IO口拉高拉低函數(shù)、定時(shí)器函數(shù)即可使用,簡(jiǎn)單方便快捷。
0.png (4.99 KB, 下載次數(shù): 177)
下載附件
2018-8-24 17:43 上傳
單片機(jī)源程序如下:
- /*****************************************
- * CS1237 designed by Robert Lee *
- * *
- *****************************************/
- #include "bsp.h"
- #include "common.h"
- //#ifdef USER_CS1237
- #define ADC_Bit 24 //ADC有效位數(shù),帶符號(hào)位 最高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 //芯片地配置 內(nèi)部REF 輸出10HZ PGA=1 通道A 0X00
- #define Lv_Bo 0.01 //濾波系數(shù) 小于1
- //sbit DOUT = P3^7;//數(shù)據(jù)對(duì)應(yīng)IO口
- //sbit SCLK = P3^5;//時(shí)鐘對(duì)應(yīng)IO口
- static long AD_Res_Last=0;//上一輪的ADC數(shù)值保存
- //延時(shí)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進(jìn)入低功耗模式
- 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;//溢出計(jì)時(shí)器
- 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;//時(shí)鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準(zhǔn)備好數(shù)據(jù)輸出 時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237全部拉低為0才算都準(zhǔn)備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 15000)
- {
- SCK_1;
- DAT_1;
- printf("here error\r\n");
- return;//超時(shí),則直接退出程序
- }
- }
- 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個(gè)脈沖了,寫8位數(shù)據(jù)
- {
- SCK_1;NOP40();
- if(dat&0x80)
- DAT_1;
- else
- DAT_0;
- dat <<= 1;
- SCK_0;NOP40();
- }
- One_CLK;//46個(gè)脈沖拉高數(shù)據(jù)引腳
- }
- //讀取芯片的配置數(shù)據(jù)
- unsigned char Read_CON(void)
- {
- unsigned char i;
- unsigned char dat=0;//讀取到的數(shù)據(jù)
- unsigned short count_i=0;//溢出計(jì)時(shí)器
- unsigned char k=0,j=0;//中間變量
- SCK_0;//時(shí)鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準(zhǔn)備好數(shù)據(jù)輸出 時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237全部拉低為0才算都準(zhǔn)備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 15000)
- {
- SCK_1;
- DAT_1;
- printf("here outtime error\r\n");
- return 1;//超時(shí),則直接退出程序
- }
- }
- 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個(gè)脈沖了,讀取數(shù)據(jù)
- {
- One_CLK;
- dat <<= 1;
- if(ReadGpio(10,1) ==1)
- dat++;
- }
- One_CLK;//46個(gè)脈沖拉高數(shù)據(jù)引腳
- return dat;
- }
- //讀取ADC數(shù)據(jù),返回的是一個(gè)有符號(hào)數(shù)據(jù)
- long Read_CS1237(void)
- {
- unsigned char i;
- long dat=0;//讀取到的數(shù)據(jù)
- unsigned char count_i=0;//溢出計(jì)時(shí)器
- // DOUT = 1;//端口鎖存1,51必備
- SCK_0;//時(shí)鐘拉低
- while(ReadGpio(10,1) ==1)//芯片準(zhǔn)備好數(shù)據(jù)輸出 時(shí)鐘已經(jīng)為0,數(shù)據(jù)也需要等CS1237拉低為0才算都準(zhǔn)備好
- {
- delay_500us(10);
- count_i++;
- if(count_i > 300)
- {
- SCK_1;
- DAT_1;
- printf("Read_CS1237 outtime error\r\n");
- return 0;//超時(shí),則直接退出程序
- }
- }
- // DOUT = 1;//端口鎖存1,51必備
- dat=0;
- for(i=0;i<24;i++)//獲取24位有效轉(zhuǎn)換
- {
- SCK_1;
- NOP40();
- dat <<= 1;
- if(ReadGpio(10,1) ==1)
- dat ++;
- SCK_0;
- NOP40();
- }
- for(i=0;i<3;i++)//一共輸入27個(gè)脈沖
- {
- One_CLK;
- }
- //DAT_1;
- //先根據(jù)宏定義里面的有效位,丟棄一些數(shù)據(jù)
- i = 24 - ADC_Bit;//i表示將要丟棄的位數(shù)
- dat >>= i;//丟棄多余的位數(shù)
- return dat;
- }
- //初始化ADC相關(guān)參數(shù)
- void Init_CS1237(void)
- {
- Con_CS1237();//配置CS1237
- if(Read_CON() != CS_CON)//如果讀取的ADC配置出錯(cuò),則重啟
- {
- 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);
- }
- //數(shù)字一階濾波器 濾波系數(shù)A,小于1。上一次數(shù)值B,本次數(shù)值C out = b*A + C*(1-A)
- //下面這個(gè)程序負(fù)責(zé)讀取出最終ADC數(shù)據(jù)
- 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) // 讀到正確數(shù)據(jù)
- {
- out = out*Lv_Bo + c*(1-Lv_Bo);
- AD_Res_Last = out;//把這次的計(jì)算結(jié)果放到全局變量里面保護(hù)
- }
- //printf("AD_Res_Last 0x%x\r\n",AD_Res_Last);
- return AD_Res_Last;
- }
- //#endif
復(fù)制代碼
所有資料51hei提供下載:
cs1237驅(qū)動(dòng).rar
(2.25 KB, 下載次數(shù): 744)
2018-8-24 11:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|