Использование датчика KMA210 с STM8

Датчик угла поворота 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


При копировании материалов хорошим тоном будет указание авторства и ссылка на сайт.