eddiewwm 发表于 2019-6-11 12:40:27

LGT8F328P_SSOP20 DAO 腳作ADC使用 的有趣經驗

LGT8F328P_SSOP20 在不使用 DAO 時,可用作 ADC的輸入腳,但讀數會有偏差,經驗補償 1.033 倍。以下是與A0作讀數比較的範例:

uint16_t value;

void setup() {
// put your setup code here, to run once:
analogReference(INTERNAL1V024);
pinMode(4, ANALOG);
//analogWrite(4, 127);

Serial.begin(115200);

}

void loop() {
// put your main code here, to run repeatedly:
value = analogRead(DACO);
Serial.print(value*1.033);
Serial.print(",");
delay(1);

value = analogRead(0);
Serial.println(value);
delay(1);
}

eddiewwm 发表于 2019-6-11 16:32:07

另一個比較範例和結果:
uint16_t value;

void setup() {
// put your setup code here, to run once:
analogReference(INTERNAL1V024);
pinMode(4, ANALOG);
//analogWrite(4, 127);
Serial.begin(115200);
}

void loop() {
// put your main code here, to run repeatedly:
//value = analogRead(VCCM);
value = analogRead(DACO);
Serial.print(value * 1.033);
Serial.print(",");
delay(1);

value = analogRead(0);
Serial.print(value);
Serial.print(",");
delay(1);
value = analogRead(1);
Serial.print(value);
Serial.print(",");
delay(1);
value = analogRead(4);
Serial.print(value);
Serial.print(",");
delay(1);
value = analogRead(5);
Serial.print(value);
Serial.print(",");
delay(1);
MCUSR |= (1 << SWDD) ; //disable SWD port to let SSOP20 package AD6 & AD7 working properly
MCUSR |= (1 << SWDD) ; //second write to confirm disable SWD port
value = analogRead(6);
Serial.print(value);
Serial.print(",");
delay(1);
value = analogRead(7);
MCUSR &= ~(1 << SWDD) ; //enable SWD port
MCUSR &= ~(1 << SWDD) ; //second write to confirm enable SWD port
Serial.println(value);
delay(1);
}

eddiewwm 发表于 2019-6-11 18:40:15

本帖最后由 eddiewwm 于 2019-6-13 18:51 编辑

不使用 analogRead(),改用 ADMUX,ADCSRD, ADCSRA 寄存器 直接讀取 ADC 的範例:
uint16_t value;

void setup() {
Serial.begin(115200);
ADMUX = 0x88; // REFS to set Vref, ADLAR to set ADC value aligment, CHMUX to set ADC source
ADCSRD = 0x91; //used VDS to set voltage divider source
ADCSRA = 0xE5; //ADATE to set auto trigger
DAPCR = 0xB8; // DAPEN to enable DiffAmp, DNS to select -ve input source, DPS to select +ve input source
ADCSRC = 0x82; // DIFS to select Differential Amp

}

void loop() {
int tempL = ADCL;
int tempH = ADCH;
tempH = tempH << 8;
value = (tempH + tempL);
Serial.println(value);
delay(100);
}

wing 发表于 2019-6-12 11:51:54

居然还有这种另类方法,楼主真是太厉害了

liuje 发表于 2019-6-12 12:00:51

厲害, 竟然有這種用法,以後ADC不夠時,也可以參考這樣幹了..    感謝分享!:lol
页: [1]
查看完整版本: LGT8F328P_SSOP20 DAO 腳作ADC使用 的有趣經驗