Аналоговия потенциометър има редица недостатъци, предимно бързо износване, дребезг, ниска устойчивост на влага, ниска шумоустойчивост, ако се намира на отдалечено място от контролера и т.н.
Цифровия потенциометър не се бои от влага, дълговечност, точност, шумоустойчивост. Практически е вечен и живота му се ограничава до механическо разрушаване. Използва се предимно в апаратури, където се изисква надеждна работа, примерно медицинската апаратура.
Направих набързо един такъв потенциометър, за да създам темпелийт при работа с контролери на STM32.
Магнитния датчик е AS5600. Състои се от 4 бр. аналогови датчика на хол и един аксиален магнит. Има аналогов изход за АЦП и цифров за шина I2C с разрядност 12-бита или 4096. Има почти идеална линейност и регулира изключително плавно и прецизно, така както аналоговия не може. Има 4096 стойности за 360 градуса, което много.
Аналоговия изход не ме интересува, защото той е неустойчив към смущения, интересен е цифровият. Адресът на слейфа е 0х36 и е непрограмируем. Това означава, че на една шина може да се върже само един датчик. Има такива от същото семейство датчици с програмируем адрес и могат да се вържат до 16 датчика.
Тук давам кода са STM32, той е универсален, защото съм го правил с библиотека HAL и може да се приложи на всеки контролер STM без изключение, след инициализация на I2C.
Код:
uint8_t buffer [2];
uint16_t angle = 0;
void AS5600_Read (uint16_t addr, uint16_t* val) {
for (uint8_t i = 0; i < 2; i++) {
HAL_I2C_Mem_Read(&hi2c1, 0x36<<1, addr + i, 1, (uint8_t*)buffer, sizeof(buffer), 100);
}
*val = *(uint16_t*)&buffer;
}
Прототип:
AS5600_Read (0x0C, &angle);
0x0C е адреса на регистъра от даташийта на датчика. Това са 4-тири регистъра за четене с 4-тири адреса.
Защо давам кода?
Ами никъде из интернет не се намира код за четене на датчика за STM32. Може някой да прояви интерес и това ще го улесни.