极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 24714|回复: 6

analogRead 跟analogWrite 的问题

[复制链接]
发表于 2014-9-26 13:16:30 | 显示全部楼层 |阅读模式
   最近遇到一个问题,两块板子间通信,我想通过 上位机 往analogWrite(A0),两块板子的A0口直联(试过直接加电阻,或者电阻接地,测电压的方法),下位机直接去 analogRead(A0).
  然后我去通过同一块板子去测试,
  analogWrite(9, brightness);   
    value=analogRead(9);
   Serial.print(value);
   Serial.print("-");
   Serial.println(brightness);

发现value的值跟brightness的值是不一样的?这是为什么呢?
264-205
261-200
264-195
260-190
264-185
259-180
264-175
259-170
265-165
262-160
267-155
261-150
266-145
262-140
266-135
260-130
263-125
261-120
262-115
  或者我怎么能实现将上位机的值 直接通过下位机的pin口传输过去?

回复

使用道具 举报

发表于 2014-9-26 13:32:47 | 显示全部楼层
是不是要共地一下?

另外,用这个口传数字型号应该不是很合适吧?
回复 支持 反对

使用道具 举报

发表于 2014-9-26 14:02:56 | 显示全部楼层
analogWrite(9, brightness);   
value=analogRead(9);

analogWrite 是對 PWM 接口的.
而 analogRead 是對 analog 接口的.
analogWrite (9,..)  跟  analogRead(9) 並非指向同一地方.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-26 14:40:11 | 显示全部楼层
Super169 发表于 2014-9-26 14:02
analogWrite(9, brightness);   
value=analogRead(9);

谢谢,我也看到这个了。我在试其他的办法,准备将 获得的值转换为二进制数,多开几个digtialPIN,通过digitalWrite,跟digtitalRead 去试试
回复 支持 反对

使用道具 举报

发表于 2014-9-26 17:03:30 | 显示全部楼层
lyhlyly 发表于 2014-9-26 14:40
谢谢,我也看到这个了。我在试其他的办法,准备将 获得的值转换为二进制数,多开几个digtialPIN,通过digi ...

要注意, analogRead 跟 analogWrite 就是接對了線 (例如 D3 接了 A0), 結果也是不同的.
因為 analogWrite 是用 PWM 形式模擬 analog, 跟 analog output 不同的, 只會讀到 0 或 1023.

如果你可以準確量出 HIGH LOW 的比例, 或許可以把 PWM 接到 Digital In, 再用 pulseIn 去測量 HIGH LOW 比例, 而推算原來 analogWrite 的值.

例如:  用一塊板自行測試, 把 D3 接 D5, 執行以下程式:  


  1. void setup() {

  2.   Serial.begin(57600);
  3.   // put your setup code here, to run once:
  4.   pinMode(3, OUTPUT);
  5.   pinMode(5, INPUT);
  6.   
  7.   analogWrite(3, 200);
  8.   
  9. }

  10. void loop() {
  11.   // put your main code here, to run repeatedly:
  12.   int ph, pl, val;
  13.   ph = pulseIn(5, HIGH);
  14.   pl = pulseIn(5, LOW);
  15.   val = 255.0 * ph / (ph + pl);
  16.   
  17.   Serial.print(pl);
  18.   Serial.print("  ");
  19.   Serial.print(ph);
  20.   Serial.print("  ");
  21.   Serial.print(val);
  22.   Serial.println();
  23.   delay(1000);
  24. }
复制代码


但由於 pulseIn 的準確性有些少偏差, 還原的數值會有少少變左, 但都在 +/- 1 之內.

是否可以用得著, 要看你對數值準確性的要求了.  如果只是用來控制光亮度, 應該是沒問題的.
回复 支持 反对

使用道具 举报

发表于 2014-9-26 17:06:09 | 显示全部楼层
本帖最后由 Super169 于 2014-9-26 17:39 编辑

相信如果加入一定的濾波程式, 或者可以準確還原模擬輸出的數值.
又或耆每次只發出一個代表 0-51 的數值, 以5 個 數為一格, 輸出中間值, 而接收時把數值 / 5.
例如以:  0-4 代表 0, 輸出 2, 5-9 代表 1, 輸出 7, 即輸出 5 * N + 2 去代表 N, 應該可以較準確地還原的.

有興趣可以一試.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-29 11:38:31 | 显示全部楼层
Super169 发表于 2014-9-26 17:06
相信如果加入一定的濾波程式, 或者可以準確還原模擬輸出的數值.
又或耆每次只發出一個代表 0-51 的數值, 以 ...

目前实现了 digitalWrite 跟digitalRead.这两天在玩多线程。 看了你的回复,国庆这几天又有得玩啦。非常感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 19:35 , Processed in 0.049466 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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