#include "ads1015.h" #include "stm32f10x_i2c.h" #include "sys.h" static void ADS1115_delay(u16 D) { while(--D); } void delay_nms(u16 ms) { u16 i; u32 M = 0;//720W for(i = 0;i < ms; i++) for(M=12000;M > 0;M--); } void delay_nus(u16 us) { u16 i; u16 M = 0;//720W for(i = 0;i < us; i++) for(M=72;M > 0;M--); } /////////////////PA8 SDA////PA9 SCL/////////////////////////////////// void ADS1115_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//A SCL SDA GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); SDA_A1; SCL_A1; } //I2C???? void I2CStart_A(void) { SDA_A1; ADS1115_delay(5); SCL_A1; ADS1115_delay(5); SDA_A0; ADS1115_delay(5);//MIN 160ns SCL_A0; ADS1115_delay(5); } //I2C???? void I2CStop_A(void) { SDA_A0; ADS1115_delay(5); SCL_A1; ADS1115_delay(5); SDA_A1; ADS1115_delay(5);//MIN 160ns } //I2C ???? void I2CWriteByte_A(u8 DATA) { u8 i; SCL_A0; for(i = 0;i < 8; i++) { if(DATA&0x80) { SDA_A1; } else { SDA_A0; } SCL_A1;//???????? ADS1115_delay(5); SCL_A0; ADS1115_delay(5); DATA = DATA << 1; } SDA_A1; SCL_A1; ADS1115_delay(5); SCL_A0; } //I2C ???? u8 I2CReadByte_A(void) { u8 TData=0,i; for(i=0;i<8;i++) { SCL_A1; ADS1115_delay(5); TData=TData<<1; if(SDA_AI) { TData|=0x01; } SCL_A0; ADS1115_delay(5); } SCL_A0; ADS1115_delay(5); SDA_A0; ADS1115_delay(5); SCL_A1; ADS1115_delay(5); SCL_A0; ADS1115_delay(5); SDA_A1; return TData; } /********************************************************************* *????: ADS1115Config *? ?: ??ADS1115??????,?????? *? ?: HCMD :????8?(??,??,????) LCMD : ????8?(????? ???? ???? ??????) *? ?; ? ********************************************************************/ void ADS1115Config_A(u8 LCMD,u8 HCMD) { u8 i=0; u8 Initdata[4]; Initdata[0] = 0x90; // ??0x90 ??ADR?? ???? Initdata[1] = 0x01;// ????? Initdata[2] = HCMD; // ?????? Initdata[3] = LCMD; // ?????? SCL_A1; I2CStart_A(); //?? for(i=0;i<4;i++) { I2CWriteByte_A(Initdata[i]); ADS1115_delay(10); } I2CStop_A(); //?? } void SetThresHold_A(u16 L_TH,u16 H_TH) //?????? { SCL_A1; I2CStart_A(); // ?? I2CWriteByte_A(0x90); I2CWriteByte_A(0x02);//??????? I2CWriteByte_A((L_TH>>8)); I2CWriteByte_A(L_TH); I2CStop_A(); //?? I2CStart_A(); //?? I2CWriteByte_A(0x90); I2CWriteByte_A(0x03);//??????? I2CWriteByte_A((H_TH>>8)); I2CWriteByte_A(H_TH); I2CStop_A(); //?? } /******************************************************************* *????: ReadAD_A *? ?: ??AD???? *? ?: ??????????????? *? ?; ? ********************************************************************/ vs16 Data[2]={0,0}; u16 ReadAD_A(void) { //??????? SCL_A1; I2CStart_A(); I2CWriteByte_A(0x90); I2CWriteByte_A(0x00); I2CStop_A(); I2CStart_A(); I2CWriteByte_A(0x91); Data[0] = I2CReadByte_A(); Data[1] = I2CReadByte_A(); I2CStop_A(); Data[0] = Data[0]<<8 | Data[1]; return (Data[0]);//&0x7fff } u16 getad(u8 LCMD,u8 HCMD) { u16 value=0; static u16 lastvalue=0; ADS1115Config_A(LCMD,HCMD); //???? // delay_nms(5); value=ReadAD_A(); return value; } u16 lvbo(u8 LCMD,u8 HCMD) //?30?????? { static u16 data; static u32 U=0, temp; //u32 float?double static u8 index = 0; static u8 flag = 0; #if 1 if(flag == 0) { U+=getad(LCMD,HCMD); if( index++>=9 )flag=1; return data; // } else { flag = 0; temp=U; U=0; index =0; data = temp/10; return data; // } #else for(index=0;index<10;index++) { U+=getad(LCMD,HCMD); } temp=U; U=0; #endif return ((float)temp/10); // } u16 t,result; float t1; u16 resultFlag = 0; float GetSampleVolt(u8 key) { static u32 timer = 0; if(key==1) { // result=lvbo(0xeb,0x82); //A0 A1???????? ???+???1111 1011,1000 0010 result=lvbo(0x82,0xeb); if(result >= 0x8000 && result <= 0xffff) result = 0xffff - result; //????????,??A0 A1????? else if(result >= 0xffff) result = 0; t1=4.096*2*result/65535; //????? if(result == 0x7fff || result == 0x8000) { //printf("????!\r\n\r\n"); } else { //printf("????!\r\n\r\n"); } }else if(key==2){ result=lvbo(0xb2,0xe3); if(result >= 0x8000) { resultFlag =1; result = 0xffff - result; //????????,??A2 A3????? } else { resultFlag =0; } t1=4.096*2*result/65535; //adc ΅ηΡΉ // 4.99/1332.99 X s =t1; //t1 = t1*1332.99/4.99; t1 = t1*13329.9/4.99; if(resultFlag == 1) { if(TickOut(&timer, 2000)==TRUE) { printf("Negative voltage sample fault!\r\n"); TickOut(&timer, 0); } t1 = 0-t1; } else { //printf("????!\r\n\r\n"); } } else if(key == 3) { result=lvbo(0xb4,0xe3); if((result >= 0x8000) && (result <= 0xffff)) result = 0xffff - result; //????????,??A0 A1????? else if(result >= 0xffff) result = 0; t1=2.048*2*result/65535; //????? //printf("???2.048V,A0-A1???? = %f V\r\n",t1);//?? if(result == 0x7fff || result == 0x8000) { //printf("????!\r\n\r\n"); } else { //printf("????!\r\n\r\n"); } } return t1; }