Датчик угла поворота KMA210 и STM8
Здесь я расскажу о моих первых прикидках, как использовать датчик угла поворота KMA210 совместно с микроконтроллером STM8. Для STM8 я использую компилятор Raisonance. На самом деле использовать этот сенсор по-настоящему мне пока не требуется. Поэтому здесь будет только предварительная, самая простая информация о том, как его использовать.
Датчик KMA210 программируемый, но я специально не буду касаться этой темы. В отличие от KMA200, который имел два режима работы: цифровой и аналоговый, этот датчик имеет только аналоговый режим. Поэтому, чтобы получить с него данные, нужно использовать АЦП. Нет ничего проще. Заведём переменную и будем в прерывании помещать в неё значение с АЦП. Используем последовательное преобразование на нулевом канале ADC2.
static volatile u16 uAngleValue = 0; u16 GetAngle_KMA210(void) { return uAngleValue; } void Init_KMA210(void) { ADC2_DeInit(); ADC2_Init(ADC2_CONVERSIONMODE_CONTINUOUS, ADC2_CHANNEL_0, ADC2_PRESSEL_FCPU_D8, ADC2_EXTTRIG_TIM, DISABLE, ADC2_ALIGN_RIGHT, ADC2_SCHMITTTRIG_ALL, DISABLE); ADC2_ITConfig(ENABLE); ADC2_StartConversion(); } void ADC2_IRQHandler(void) interrupt 22 { uAngleValue = ADC2_GetConversionValue(); ADC2_ClearITPendingBit(); }
Теперь как это цифровое значение с АЦП преобразовать в нормальный угол, в градусах? Попробовав несколько KMA210, покрутив магнит туда-сюда, я нашёл точку перелома и определил максимальное и минимальное значение, которое я получаю с АЦП. Минимальное значение было где-то в районе 50, а максимальное — в районе 970. То есть угол, допустим, снижается, достигает 50, и резко становится 970. Это и есть точка перелома. Таких точек на окружности будет 2, так как датчик KMA210 определяет угол не больше 180°. Соответственно, градусы будут меняться от 0 до 179.
Несколько констант зададут основные параметры преобразования в градусы:
#define MAX_ANGLE_KMA210 970 #define MIN_ANGLE_KMA210 50 #define MAX_DEGREE_KMA210 179Теперь сам код преобразования. Значение с АЦП может немного превышать заданное, или наоборот, быть чуть ниже. Поэтому значение нужно немного «обрезать» простым сравнением. Ну а дальше само преобразование.
s16 iResult; if (iResult > MAX_ANGLE_KMA210) iResult = MAX_ANGLE_KMA210; if (iResult < MIN_ANGLE_KMA210) iResult = MIN_ANGLE_KMA210; iResult = (iResult - MIN_ANGLE_KMA210); // преобразование в градусы, 0-179° iResult /= (float) (MAX_ANGLE_KMA210 - MIN_ANGLE_KMA210) / MAX_DEGREE_KMA210;
Почему минимальное значение именно 50? Наверное, это даже можно как-то настраивать, если разобраться с режимом программирования параметров этого датчика. Но как раз этого я пока делать не стал, так как там какой-то сумасшедший 1Wire-подобный интерфейс, который с первого раза напрочь отказался откликаться на команды (в отличие от DS18B20, с которым всё просто). Оставил эту затею до тех пор, пока в ней не возникнет реальной надобности.
Примечание
KMA210 можно рассматривать как замену датчика угла поворота KMA200, который снят с производства. Также можно рассмотреть, например AS5050 (SPI-интерфейс).
Автор: амдф
Дата: 18.02.2013
Избранное
Остальное
Лента atom