hex.pp.ua

Использование датчика 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-интерфейс).

система комментирования CACKLE

Автор: амдф
Дата: 18.02.2013


Разделы сайта
Главная
Блог
Native API
NTFS и ReFS
Микроконтроллеры
Справочник NTDLL
Коды NTSTATUS
Разное

Избранное
NTFS Stream Explorer
Native Shell
Тенгвар

Остальное
nvpnhcknn (архив)
English pages
Контакты

Ленты atom
Лента Atom сайта Лента Atom блога



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