|
2#
樓主 |
發表於 2015-8-28 12:28:37
|
只看該作者
本帖最後由 lostsnow 於 2015-8-28 13:27 編輯
已自行解決 ^_^
小弟太小看 Arduino 了,在網路上查了些資料,本以為 Tick 跟不上所以誤差大,
覺得要靠硬體除頻,沒想到隨手改了一下還滿精準的,就獻醜了。
用二片開發板做實驗,pin 2 接 pin 2,
下次會帶去朋友那用示波器及頻率產生器在確認。
程式 Send_Freq.ino:利用 IRremote Library 發送從 32~100 Khz 之間的訊號
#include <IRremote.h>
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
void setup()
{
Serial.begin(9600);
}
unsigned int rawbufb[] = {9000, 4500};
int freq = 32;
void loop() {
Serial.print(F("Send freq = "));
Serial.print(freq);
Serial.println(F(" Khz"));
irsend.sendRaw(rawbufb, 2, freq /* kHz */);
freq++;
if (freq == 101) freq = 32;
delay(3000);
}
程式 Check_Freq.ino:接收端
volatile unsigned long StartTime = 0;
volatile unsigned int Count = 0;
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT);
attachInterrupt(0, onTick, RISING);
}
void loop()
{
}
void onTick()
{
if (Count == 0) {
StartTime = micros();
}
Count++;
if (Count == 128) { // 取樣次數
unsigned long Sumtime = micros() - StartTime;
Count = 0;
if (Sumtime < 10000){ // 防止前次干擾
unsigned long fq = ((1000000 * 128 / Sumtime));
Serial.print(fq);
Serial.print(" Hz Time = ");
Serial.print(Sumtime);
Serial.println(" us");
}
}
}
接收端結果:
....
100000 Hz Time = 1280 us
100313 Hz Time = 1276 us
100313 Hz Time = 1276 us
100628 Hz Time = 1272 us
100628 Hz Time = 1272 us
32000 Hz Time = 4000 us
33057 Hz Time = 3872 us
34042 Hz Time = 3760 us
心得:
一、「方法一:單位次數所花費的時間」、「方法二:單位時間所觸發的次數」
上面是放方法一,稍微精準一些,缺點是偵測時間不固定。
二、取樣次數越少,誤差越大,如果能實際量測校正,可以用補正值的方法改善誤差。
三、sendRaw 頻率設太高或太低會有問題,32~100 Khz 已符合需求,就懶得在研究了。
結語:
小弟覺得最困難點克服,其他應該都不是問題,上面程式還有優化的空間....
偷紅外線訊號一小段做載波頻率偵測,decode 時在把偷的時間補償回去,
不然在差就先按一下載波頻率偵測,在按一下 decode 分二次做。 |
|