7

AS5045 и STM32

AS5045 и STM32 As5045, Stm32, Электроника, Длиннопост

И снова здравствуйте. Хотел бы продолжить тему про магнитный энкодер AS5045, начатую в моей прошлой статье(https://pikabu.ru/story/as5045_i_arduino_6724136).  Но на этот раз датчик подключается не к ардуино, а к STM32F103C8T6. Так как ардуино оказалась слишком медленной  для  одновременного считывания двух датчиков, выполнение вычислений и многого другого не относящегося к теме. Писался код в System Workbench for STM32 (SW4STM32), но образцы представленного кода должны работать в любой другой среде. Кстати, большей частью эти функции практически полностью перекопированы из библиотеки для ардуино но с оглядкой на частоту STM.

И так начнем с выставления портов ввода-вывода в нужные состояния: CS,CLK - OUTPUT;  DO - INPUT. Названия пинов отражают к какому выводу подключаться на плате датчика.

AS5045 и STM32 As5045, Stm32, Электроника, Длиннопост

Теперь тактирование. Оно максимально насколько это возможно и где это возможно:

AS5045 и STM32 As5045, Stm32, Электроника, Длиннопост

Вначале нужно объявить следующие дефайны:



#define AS5045_STATUS_OCF 0x10

#define AS5045_STATUS_COF 0x08

#define AS5045_STATUS_LIN 0x04

#define AS5045_STATUS_MAGINC 0x02

#define AS5045_STATUS_MAGDEC 0x01


Встречайте, функция инициализации датчика!


_Bool AS5045_Init()

{

uint8_t count = 0;

while (AS5045_Read(), (_status & AS5045_STATUS_OCF) == 0)

{

if (count > 30)

{

return 0 ; //ошибка инициализации

}

HAL_Delay(5);

count++;

}

return 1;

}


А вот и само считывание статуса датчика и его положения:


uint16_t AS5045_Read()

{


HAL_GPIO_WritePin(GPIOB,CS_PIN_Pin,0); 


uint16_t value = 0;

uint8_t i = 0;


status = 0;

for (i = 0; i <12; i++)

{

HAL_GPIO_WritePin(GPIOB,CLK_PIN_Pin,0);

for(uint8_t i = 0; i < 4; i++){}  //без подобных циклов датчик не

HAL_GPIO_WritePin(GPIOB,CLK_PIN_Pin,1);  //успевает передать данные и на выходе

for(uint8_t i = 0; i < 2; i++) {}  //рандомные числа

value = (value << 1) | HAL_GPIO_ReadPin(DO_PIN_GPIO_Port,DO_PIN_Pin);

}


for ( i = 0 ; i < 6 ; i++)

{

HAL_GPIO_WritePin(GPIOB,CLK_PIN_Pin,0);

for(uint8_t i = 0; i < 4; i++){}

HAL_GPIO_WritePin(GPIOB,CLK_PIN_Pin,1);

for(uint8_t i = 0; i < 2; i++){}


status = (status << 1) | HAL_GPIO_ReadPin(DO_PIN_GPIO_Port,DO_PIN_Pin);

}


HAL_GPIO_WritePin(GPIOB,CS_PIN_Pin,1);


_status = status >> 1 ;


return value ;

}


В принципе это все что я хотел показать сегодня. Тут нет программирования нулевого положения и, возможно, она не самая оптимальная по производительности, но эти функции делают все что мне нужно. Спасибо за внимание!

Найдены возможные дубликаты

0

Вы это ногодрыгом сделали, то есть ресурсы такого контроллера используете не оптимально... В этом камне есть специальный модуль (SPI) для подобных применений, будет работать почти не занимая ресурсы ядра.

раскрыть ветку 2
0

Оба SPI уже заняты, так что пришлось так

раскрыть ветку 1
0

Можно на один порт несколько устройств повесить, но я не в курсе что там за устройства и какие ограничения еще есть, так что Вам виднее.

0
Пили на Хабре статью, вроде там больше целевая аудитория. А Ардуино - не занимался, но уважаю))
раскрыть ветку 1
0

Не надо с таким на хабр, заклюют насмерть.

0

Красиво написано. Суперски нарисовано.

А нафиг оно надо и что может?

раскрыть ветку 2
+1

В начале статьи есть ссылка на первую статью по данному датчику, там описано для чего я его применяю

раскрыть ветку 1
+1

пасиба. интересно.

но лениво...)))

Похожие посты
Похожие посты закончились. Возможно, вас заинтересуют другие посты по тегам: