как подружить uno с ZSC31050 по I2C?

swirlies90s
Offline
Зарегистрирован: 17.02.2020

Всем привет. Попалась мне в руки микра ZSC31050. Прикольная штука для работы с тензодатчиками мостового типа. Ее фишка в том, что к ней можно подключить тензодатчики и параллельно на нее повесить терморезистор. Произвести калибровку измеряемой величины при разных силовых воздействиях и при разной температуре (все это делается на отладочной плате ZMC с их родным софтом). После манипуляций с калибровкой и сохранением коэффициентов в память микры, вы получаете микроконтроллер прошитый именно под этот тензодатчик и именно под этот терморезистор. Тем самым получаем тензодатчик стабилизированный по температуре. ZSC может выдавать аналоговый сигнал (напряжение, токовая петля), ШИМ, и цифровой (I2C, OWI и SPI).

Проекте предполагается минимум проводов, поэтому на плате от микры выведено только питание, пины для подключения датчиков (тензо и термо) и I2С (по нему калибруем, зашиваем коэффициенты и далее забираем данные). 

Знания по ардуино у меня начальные. поэтому для начала нарыл вот такой скетч и попытался прочитать значения тензиков с микры

#include <Wire.h> //подключаю библу i2c
void setup() {
Wire.begin();  // активирую шину i2c
Serial.begin(9600); // указываю скорость общения
}

void loop() {
Wire.beginTransmission(0x75); //открываю трансмиссию с адресом давайса 0x75
Wire.write(0);                // в первый бит записываю 0, для чтения инфы с девайса
Wire.endTransmission();       // закрываю трансмиссию

Wire.beginTransmission(0x75); //открываю трансмиссию по новой
Wire.requestFrom(0x75, 2);    // запрашиваю 2 байта от девайса с адресом 0x75

uint8_t val = Wire.read();   // результат записываю в переменную val

Serial.println(val);     // вывожу значение на монитор порта       
Wire.endTransmission();  // закрываю трнасмиссию

delay(500);             
}

В итоге приходит 255, воздействую на тензомост, безрезультатно. В родной отладочной программе значения приходящие тензика меняются в диапазонее 3200 до 32768 (у терморезистора от 15000 до 32768), т.е. там все работает как надо. АЦП то у микры 15 разрядный, поэтому до 32768 значения показывает.

В скетче пытался прочитать 2 байта (в которых по логике должно быть записано значение с тензика). Но моя логика не верна. В идеале считывать значения с тензика и термистора, но каким образом пока недогадался. Штудирую даташ и мануал к микре, но пока явных указаний к регистрам отвечающим за датчик и термистор не нашел. 

https://drive.google.com/open?id=16IUdwxr0t7zIFSgtbJpRRKfTJm-Yc97Q даташ на ZSC

https://drive.google.com/open?id=16Kqm8IkriamaHbSYqO1GDs9pd2ZFj2dr  тех.описание

https://drive.google.com/open?id=1XI0RYMaWmtBESnLOoh83HBIZ47onMXZM описание калибровочного набора

Цель: по I2с прочитать значения тензомоста и термистора.

 

rkit
Offline
Зарегистрирован: 23.11.2016

swirlies90s пишет:

uint8_t val = Wire.read();   // результат записываю в переменную val

Это ты один из двух байт от результата записал в переменную.

swirlies90s
Offline
Зарегистрирован: 17.02.2020
uint16_t val = Wire.read(); // поменял на это, сейчас в мониторе 65535 т.е. максимум

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Ничего, что Wire.read() возвращает только байт?

rkit
Offline
Зарегистрирован: 23.11.2016

swirlies90s пишет:

Wire.beginTransmission(0x75); //открываю трансмиссию по новой
Wire.requestFrom(0x75, 2);    // запрашиваю 2 байта от девайса с адресом 0x75

И это тоже хрень какая-то. Короче нужно открыть https://www.arduino.cc/en/reference/wire и прочитать, прежде чем колдовать.