7 .angle_register = 0x0E,
15 .angle_register = 0xFE,
27 chip_address = _chip_address;
29 angle_register_msb = _angle_register_msb;
31 cpr = pow(2, _bit_resolution);
38 lsb_used = _bit_resolution - _bits_used_msb;
40 lsb_mask = (uint8_t)( (2 << lsb_used) - 1 );
41 msb_mask = (uint8_t)( (2 << _bits_used_msb) - 1 );
56 lsb_mask = (uint8_t)( (2 << lsb_used) - 1 );
57 msb_mask = (uint8_t)( (2 << bits_used_msb) - 1 );
70 velocity_calc_timestamp =
_micros();
73 full_rotation_offset = 0;
74 angle_data_prev = getRawCount();
81 float angle_data = getRawCount();
86 float d_angle = angle_data - angle_data_prev;
88 if(abs(d_angle) > (0.8*cpr) ) full_rotation_offset += d_angle > 0 ? -
_2PI :
_2PI;
91 angle_data_prev = angle_data;
94 return (full_rotation_offset + ( angle_data / (
float)cpr) *
_2PI) ;
100 unsigned long now_us =
_micros();
101 float Ts = (now_us - velocity_calc_timestamp)*1e-6;
103 if(Ts <= 0 || Ts > 0.5) Ts = 1e-3;
108 float vel = (angle_c - angle_prev)/Ts;
111 angle_prev = angle_c;
112 velocity_calc_timestamp = now_us;
118 int MagneticSensorI2C::getRawCount(){
119 return (
int)MagneticSensorI2C::read(angle_register_msb);
128 int MagneticSensorI2C::read(uint8_t angle_reg_msb) {
131 uint16_t readValue = 0;
133 wire->beginTransmission(chip_address);
134 wire->write(angle_reg_msb);
135 wire->endTransmission(
false);
138 wire->requestFrom(chip_address, (uint8_t)2);
139 for (
byte i=0; i < 2; i++) {
140 readArray[i] = wire->read();
147 readValue = ( readArray[1] & lsb_mask );
148 readValue += ( ( readArray[0] & msb_mask ) << lsb_used );
161 pinMode(scl_pin, INPUT_PULLUP);
162 pinMode(sda_pin, INPUT_PULLUP);
165 if (digitalRead(scl_pin) == LOW) {
170 if(digitalRead(sda_pin) == LOW) {
172 pinMode(scl_pin, OUTPUT);
173 for (
byte i = 0; i < 16; i++) {
175 digitalWrite(scl_pin, LOW);
176 delayMicroseconds(20);
177 digitalWrite(scl_pin, HIGH);
178 delayMicroseconds(20);
180 pinMode(sda_pin, INPUT);
181 delayMicroseconds(20);
182 if (digitalRead(sda_pin) == LOW) {
189 pinMode(sda_pin, INPUT);
190 pinMode(scl_pin, INPUT);