decode ADC

This commit is contained in:
alan
2019-05-31 15:14:01 +08:00
parent 150187c1f5
commit 3ea2f423cc
2 changed files with 68 additions and 16 deletions
@@ -663,8 +663,8 @@ static uint8_t *spi_transact_rec_instruction();
*/
// static void spi_DAC_transact_instruction();
static void ADC_write(uint8_t ADCin);
static void ADC_read();
static void DecodeADC(uint8_t *ADCrx);
static void ADC_read(uint8_t ADCin);
static void DecodeADC(uint8_t ADCin);
/**
* update the instruction of ADC control register
@@ -895,21 +895,24 @@ static void update_ZM_instruction(uint8 *ins) {
// V1 = AIN0 voltage
// V1 / 1000 = Iin (mA)
case 0 :{
ADC_write(0xC1);
ADCin = 0xC1;
ADC_write(ADCin);
break;
}
// AINp is AIN1; AINn is GND
// AIN1 = 25 * AIN0
case 1 :{
ADC_write(0xD1);
ADCin = 0xD1;
ADC_write(ADCin);
break;
}
// AINp is AIN2; AINn is GND
// AIN2 = 25 * AIN1 = 625 * AIN0
case 2 :{
ADC_write(0xE1);
ADCin = 0xE1;
ADC_write(ADCin);
break;
}
@@ -917,7 +920,8 @@ static void update_ZM_instruction(uint8 *ins) {
// AIN3 = (-0.1) * Vin (V)
// Vo = GNDS - Vin/10 (to GNDA)
case 3 :{
ADC_write(0xF1);
ADCin = 0xF1;
ADC_write(ADCin);
break;
}
default :{
@@ -926,7 +930,7 @@ static void update_ZM_instruction(uint8 *ins) {
}
CPUdelay(16000);
ADC_read();
ADC_read(ADCin);
break;
}
default:{
@@ -169,7 +169,7 @@ static void ADC_write(uint8_t ADCin) {
PIN_setOutputValue(pin_handle, ADC_CS, 1); // ADC_CS HIGH
}
static void ADC_read(){
static void ADC_read(uint8_t ADCin){
if(SPI_mode != SPI_ADC){
SPI_close(spiHandle0); //
@@ -186,7 +186,7 @@ static void ADC_read(){
ZM_spi_transaction(SPI_ADC_SIZE, spi_ADC_txbuf, spi_ADC_rxbuf);
PIN_setOutputValue(pin_handle, ADC_CS, 1); // ADC_CS HIGH
DecodeADC(spi_ADC_rxbuf);
DecodeADC(ADCin);
SimpleProfile_SetParameter(BLE_CIS_BUFF_CHAR, SPI_ADC_SIZE, spi_ADC_rxbuf);
SimpleProfile_SetParameter(BLE_DAT_BUFF_CHAR, SPI_ADC_SIZE, spi_ADC_rxbuf);
@@ -198,15 +198,63 @@ static void ADC_read(){
// Vin = 10*GNDS - 10Vo
// = 10*GNDS - 10*(0xDDDD*187.5 uV)
// = 15 v - 10*(0xDDDD*187.5 uV)
static void DecodeADC(uint8_t *ADCrx){
uint16_t MSB = ADCrx[0]*256;
uint16_t LSB = ADCrx[1];
static void DecodeADC(uint8_t ADCin){
uint16_t MSB = spi_ADC_rxbuf[0]*256;
uint16_t LSB = spi_ADC_rxbuf[1];
double Vo = 10*(MSB+LSB)*187.5;
Vo = 15000000 - Vo;
double LSBuV = 0;
ADCin = ADCin & 0b00001110;
ADCrx[2] = (uint8_t) (Vo/1000000);
ADCrx[3] = (uint8_t) (Vo-ADCrx[0]*1000000)/10000;
switch(ADCin){
case 0x00:{
LSBuV = 187.5;
break;
}
case 0x02:{
LSBuV = 125;
break;
}
case 0x04:{
LSBuV = 62.5;
break;
}
case 0x06:{
LSBuV = 31.25;
break;
}
case 0x08:{
LSBuV = 15.625;
break;
}
case 0x0A:{
LSBuV = 7.8125;
break;
}
case 0x0C:{
LSBuV = 7.8125;
break;
}
case 0x0E:{
LSBuV = 7.8125;
break;
}
default:{
LSBuV = 187.5;
break;
}
}
double Vo = 1500000 - (MSB+LSB)*LSBuV;
Vo = Vo / 100000;
spi_ADC_rxbuf[2] = (uint8_t) (Vo/1);
spi_ADC_rxbuf[3] = (uint8_t) (100*Vo - 100*spi_ADC_rxbuf[2]);
}