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);
}
不使用 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);
}
问一下,容栅位移传感器,的寿命有长,长时间频繁使用是否会偏差。 剛買回來的模塊,詳細的不清楚,你可問賣家。 居然开始玩容栅了。。。。感觉我已经跟不上时代发展。。。。 请教楼主,这个传感器量出来的数据准确吗?精度如何? duanyz 发表于 2019-9-7 20:12
请教楼主,这个传感器量出来的数据准确吗?精度如何?
數據準確度可以,但配合的結構也會影響最終的準確性。 本帖最后由 duanyz 于 2019-9-10 10:39 编辑
eddiewwm 发表于 2019-9-9 11:42
數據準確度可以,但配合的結構也會影響最終的準確性。
感谢你的回复,可惜程序里没有什么注释,能请你说说tm003这个芯片输出的数据格式是什麽样的吗?知道了数据格式应该更容易理解程序内容。:handshake
另外请教楼主你买的是tm003a还是tm003啊?两个产品相差了100块哦,也不知有什么区别,卖家也语焉不详啊。 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 之間,在這之後就可以讀數據 和 顯示結果了。 eddiewwm 发表于 2019-4-17 16:21
不使用 pulseIn(),用 pin2 interrupt 的範例:
#define STATUS_LED 13 // To output the waveform as pin2 SCLK input
你好,这句没有太理解13脚是连接到哪里
页:
[1]