eddiewwm 发表于 2019-4-16 17:05:39

8F328-U讀取 TM003容栅位移传感器模块

8F328-U讀取 TM003容栅位移传感器模块
/*
   Capacitive Grid Sensor Module TM003 Readout Program
   https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
   Date: 20190416
   Rev: 01
   By: Eddie
*/

#define SCLK 2    // Clock come from TM003 SCLK pin
#define SDATA 3   // Data come from TM003 SDATA pin
#define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
#define minStartTime 100000//
#define maxStartTime 500000//

unsigned long startDuration = 0;
unsigned long rawData = 0;
bool startFlag = false;
bool negativeFlag = false;

void setup() {
pinMode(SCLK, INPUT);
pinMode(SDATA, INPUT);
pinMode(CLEAR, INPUT);
Serial.begin(115200);
}

void loop() {
checkStart();
getData();
showResult();
}

void checkStart() {
startDuration = pulseIn(SCLK, HIGH);
while ((startDuration < minStartTime) or (startDuration > maxStartTime)) {
    startDuration = pulseIn(SCLK, HIGH);
}
startFlag = true;
}

void getData() {
rawData = 0 ;
for (int i = 0; i < 24; i++) {
      rawData = rawData >> 1;
    bool tmpClk = digitalRead(SCLK);
    while (tmpClk == false) {
      tmpClk = digitalRead(SCLK);
    }
    bool tmpData = digitalRead(SDATA);
    if (tmpData == true) {
      rawData = rawData | 0x00800000;
    }
    else {
      rawData = rawData & 0xFF7FFFFF;
    }
    while (tmpClk == true) {
      tmpClk = digitalRead(SCLK);
    }
}
}

void showResult(){
if (rawData & 0x00100000) {
    negativeFlag = true;
}
else {
    negativeFlag = false;
}
unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
Serial.print("Result: ");
if (negativeFlag) {
    Serial.print(" -");
}
else {
    Serial.print("");
}
Serial.println(result);
}

eddiewwm 发表于 2019-4-17 16:21:32

不使用 pulseIn(),用 pin2 interrupt 的範例:
/*
   Capacitive Grid Sensor Module TM003 Readout Program (Use Interrupt pin2)
   https://item.taobao.com/item.htm?id=17251121381&ns=1&abbucket=14#detail
   Date: 20190417
   Rev: 01
   By: Eddie
*/

#define SCLK 2    // Clock come from TM003 SCLK pin
#define SDATA 3   // Data come from TM003 SDATA pin
#define CLEAR 7   // Connect to TM003 CLEAR pin, Low 0.5sec to set Zero
#define STATUS_LED 13 // To output the waveform as pin2 SCLK input
#define minStartTime 100000//
#define maxStartTime 500000//

unsigned long startDuration = 0;
unsigned long rawData = 0;
bool startFlag = false;
bool negativeFlag = false;
volatile bool inHighFlag = false;
volatile bool inLowFlag = false;
volatile unsigned long pulseWidthStart, pulseWidthEnd, pulseWidth;

void setup() {
pinMode(SCLK, INPUT);
pinMode(SDATA, INPUT);
pinMode(CLEAR, INPUT);
pinMode(STATUS_LED, OUTPUT);
digitalWrite(STATUS_LED, LOW);
attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
Serial.begin(115200);
}

void loop() {
checkStart();
getData();
showResult();
}

void ISRrisingEdge() {
digitalWrite(STATUS_LED, HIGH);
pulseWidthStart = micros();
pulseWidth = 0;
attachInterrupt(digitalPinToInterrupt(SCLK), ISRfallingEdge, FALLING);
}

void ISRfallingEdge() {
digitalWrite(STATUS_LED, LOW);
pulseWidthEnd = micros();
pulseWidth = pulseWidthEnd - pulseWidthStart;
attachInterrupt(digitalPinToInterrupt(SCLK), ISRrisingEdge, RISING);
}

void checkStart() {
if ((pulseWidth < minStartTime) or (pulseWidth > maxStartTime)) {
    startFlag = false;
}
else {
    startFlag = true;
}
}

void getData() {
if (startFlag) {
    rawData = 0 ;
    for (int i = 0; i < 24; i++) {
      rawData = rawData >> 1;
      bool tmpClk = digitalRead(SCLK);
      while (tmpClk == false) {
      tmpClk = digitalRead(SCLK);
      }
      bool tmpData = digitalRead(SDATA);
      if (tmpData == true) {
      rawData = rawData | 0x00800000;
      }
      else {
      rawData = rawData & 0xFF7FFFFF;
      }
      if (i < 23) {
      while (tmpClk == true) {
          tmpClk = digitalRead(SCLK);
      }
      }
    }
}
}

void showResult() {
if (rawData & 0x00100000) {
    negativeFlag = true;
}
else {
    negativeFlag = false;
}
unsigned long result = rawData & 0x000FFFFF; // only use 5-byte data
Serial.print("Result: ");
if (negativeFlag) {
    Serial.print(" -");
}
else {
    Serial.print("");
}
Serial.println(result);
}

aisls 发表于 2019-4-16 17:07:14

问一下,容栅位移传感器,的寿命有长,长时间频繁使用是否会偏差。

eddiewwm 发表于 2019-4-16 17:17:08

剛買回來的模塊,詳細的不清楚,你可問賣家。

弘毅 发表于 2019-4-16 17:31:04

居然开始玩容栅了。。。。感觉我已经跟不上时代发展。。。。

duanyz 发表于 2019-9-7 20:12:46

请教楼主,这个传感器量出来的数据准确吗?精度如何?

eddiewwm 发表于 2019-9-9 11:42:36

duanyz 发表于 2019-9-7 20:12
请教楼主,这个传感器量出来的数据准确吗?精度如何?

數據準確度可以,但配合的結構也會影響最終的準確性。

duanyz 发表于 2019-9-10 09:13:08

本帖最后由 duanyz 于 2019-9-10 10:39 编辑

eddiewwm 发表于 2019-9-9 11:42
數據準確度可以,但配合的結構也會影響最終的準確性。

感谢你的回复,可惜程序里没有什么注释,能请你说说tm003这个芯片输出的数据格式是什麽样的吗?知道了数据格式应该更容易理解程序内容。:handshake


另外请教楼主你买的是tm003a还是tm003啊?两个产品相差了100块哦,也不知有什么区别,卖家也语焉不详啊。

eddiewwm 发表于 2019-9-11 10:04:41

duanyz 发表于 2019-9-10 09:13
感谢你的回复,可惜程序里没有什么注释,能请你说说tm003这个芯片输出的数据格式是什麽样的吗?知道了数据 ...

實驗的主要目的是以 8F328-U 讀取 TM003,用以體驗操作的過程,且實驗的結構也不能做得很精確,所以用的 是較平宜的 TM003。一般購買時會連同定柵,若沒有,就不能完成這實驗。

以下是賣家在d淘寶上的說明:
========================================
产品的测量速度为3m/s,显示的速度为8次/s;

1、产品供电电源3-3.3V,不得超过3.6V;电源输入需加滤波电容;

2、外部清零可通过第2线与负极短接500MS实现;

3、产品负极接地(金属),否则会出现数据不稳现象;

4、产品与反射栅之间的间隙控制在0.2mm以内为宜,反射栅可根据需要延长;

5、产品测量范围-999.99 ~ 999.99mm,分辨率为0.01mm;

6、芯片数据主动发射,不被动接收;

7、串行数据输出为开漏输出,前20位是数据,后4位是标志位;
==============================================

用示波器看到起始時脈一般在 100ms~500ms 之間,在這之後就可以讀數據 和 顯示結果了。

zsl 发表于 2021-10-22 11:07:29

eddiewwm 发表于 2019-4-17 16:21
不使用 pulseIn(),用 pin2 interrupt 的範例:

#define STATUS_LED 13 // To output the waveform as pin2 SCLK input
你好,这句没有太理解13脚是连接到哪里
页: [1]
查看完整版本: 8F328-U讀取 TM003容栅位移传感器模块