极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 19347|回复: 4

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

[复制链接]
发表于 2019-6-11 12:40:27 | 显示全部楼层 |阅读模式
LGT8F328P_SSOP20 在不使用 DAO 時,可用作 ADC的輸入腳,但讀數會有偏差,經驗補償 1.033 倍。以下是與A0作讀數比較的範例:

  1. uint16_t value;

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

  7.   Serial.begin(115200);
  8.   
  9. }

  10. void loop() {
  11.   // put your main code here, to run repeatedly:
  12.   value = analogRead(DACO);
  13.   Serial.print(value*1.033);
  14.   Serial.print("  ,  ");
  15.   delay(1);
  16.   
  17.   value = analogRead(0);
  18.   Serial.println(value);
  19.   delay(1);
  20. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2019-6-11 16:32:07 | 显示全部楼层
另一個比較範例和結果:
  1. uint16_t value;

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

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

  16.   value = analogRead(0);
  17.   Serial.print(value);
  18.   Serial.print("  ,  ");
  19.   delay(1);
  20.   value = analogRead(1);
  21.   Serial.print(value);
  22.   Serial.print("  ,  ");
  23.   delay(1);
  24.   value = analogRead(4);
  25.   Serial.print(value);
  26.   Serial.print("  ,  ");
  27.   delay(1);
  28.   value = analogRead(5);
  29.   Serial.print(value);
  30.   Serial.print("  ,  ");
  31.   delay(1);
  32.   MCUSR |= (1 << SWDD) ; //disable SWD port to let SSOP20 package AD6 & AD7 working properly
  33.   MCUSR |= (1 << SWDD) ; //second write to confirm disable SWD port
  34.   value = analogRead(6);
  35.   Serial.print(value);
  36.   Serial.print("  ,  ");
  37.   delay(1);
  38.   value = analogRead(7);
  39.   MCUSR &= ~(1 << SWDD) ; //enable SWD port
  40.   MCUSR &= ~(1 << SWDD) ; //second write to confirm enable SWD port
  41.   Serial.println(value);
  42.   delay(1);
  43. }
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 18:40:15 | 显示全部楼层
本帖最后由 eddiewwm 于 2019-6-13 18:51 编辑

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

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

  9. }

  10. void loop() {
  11.   int tempL = ADCL;
  12.   int tempH = ADCH;
  13.   tempH = tempH << 8;
  14.   value = (tempH + tempL);
  15.   Serial.println(value);
  16.   delay(100);
  17. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2019-6-12 11:51:54 | 显示全部楼层
居然还有这种另类方法,楼主真是太厉害了
回复 支持 反对

使用道具 举报

发表于 2019-6-12 12:00:51 | 显示全部楼层
厲害, 竟然有這種用法,  以後ADC不夠時,  也可以參考這樣幹了..    感謝分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-29 23:56 , Processed in 0.043241 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表