AS5600
/
main.py
85 строк · 3.6 Кб
1import sys
2from machine import I2C, Pin
3from sensor_pack_2.bus_service import I2cAdapter
4import as5600mod
5import time
6
7
8def decode_magnet_status(source: as5600mod.status_as5600, _gain: int):
9"""Выводит в stdout состояние магнита и усиление АРУ"""
10if source.min_gain_ovf:
11print("Магнит слишком сильный! Замените его на более слабый!!!")
12return
13print(f"Магнит установлен: {source.mag_detected}; Предел усиления АРУ достигнут: {source.max_gain_ovf}; Минимальное усиление: {source.min_gain_ovf}; Усиление: {_gain}")
14
15
16def decode_config(source: as5600mod.config_as5600):
17"""Выводит в stdout настройки датчика"""
18def decode_pm(pm: int) -> str:
19if 0 == pm:
20return "нормальный режим"
21return f"LPM{pm}"
22
23def decode_hyst(hyst: int) -> str:
24if 0 == hyst:
25return "выключен"
26return f"{hyst}"
27
28def decode_output_stage(stage: int) -> str:
29if 0 == stage:
30return "аналоговый выход. диапазон GND..VDD"
31if 1 == stage:
32return "аналоговый выход. диапазон 10% VDD..90% VDD"
33if 2 == stage:
34return "Цифровой выход. ШИМ."
35
36def decode_pwmf(pwmf: int) -> int:
37vals = 115, 230, 460, 920 # Гц
38return vals[pwmf]
39
40def decode_slow_filter(sf: int) -> str:
41vals = "16x", "8x", "4x", "2x"
42return vals[sf]
43
44def decode_ffh(ffh: int) -> int:
45vals = 0, 6, 7, 9, 18, 21, 24, 10
46return vals[ffh]
47
48print(f"Watchdog: {source.watchdog}")
49print(f"fast filter threshold: {decode_ffh(source.fast_filter_threshold)}; slow filter: {decode_slow_filter(source.slow_filter)}")
50print(f"PWM frequency: {decode_pwmf(source.pwm_freq)}; output stage: {decode_output_stage(source.output_stage)}")
51print(f"hysteresis: {decode_hyst(source.hysteresis)}; power mode: {decode_pm(source.power_mode)}")
52
53
54def decode_angle_pos(source: as5600mod.angle_positions, _raw: bool):
55"""Выводит в stdout угловые настройки датчика"""
56print(f"Угловые положения raw: {_raw}. старт: {source.start}; стоп: {source.stop}; диапазон: {source.angular_range}")
57
58
59if __name__ == '__main__':
60i2c = I2C(id=1, scl=Pin(7), sda=Pin(6), freq=400_000) # on Raspberry Pi Pico
61adapter = I2cAdapter(i2c)
62sensor = as5600mod.AS5600(adapter)
63print(f"Время преобразования [мкс]: {sensor.get_conversion_cycle_time()}")
64print("---Настройки датчика---")
65decode_config(sensor.get_config(noreturn=False))
66print("---Угловые настройки---")
67decode_angle_pos(sensor.get_angle_pos(raw=False), _raw=False)
68sensor.set_angle_pos(0, 360)
69decode_angle_pos(sensor.get_angle_pos(raw=False), _raw=False)
70#
71check_magnet_time = 15
72print("---Проверка наличия магнита---")
73wait_func = time.sleep_us
74for _ in range(check_magnet_time):
75decode_magnet_status(sensor.status, sensor.gain)
76time.sleep_ms(1000)
77#
78counter, _max = 0, 10_000
79sensor.start_measurement()
80for angle in sensor:
81print(f"Угол: {angle}; raw angle: {sensor.get_raw_angle(raw=True)}; коефф. усиления: {sensor.gain}; magnitude: {sensor.magnitude}")
82wait_func(100_000)
83if counter > _max:
84sys.exit(0)
85counter += 1
86
87
88