Top.Mail.Ru
Уведомления
Очистить все

Протокол bidirectional DSHOT на STM32F103

(@skya2019)
New member

Всем привет! Пытаюсь реализовать bidir DSHOT300 это протокол цифрового управления драйвером бесщеточного двигателя(подробно написано тут). За основу взял библиотеку на HAL.

Если вкратце то вся суть протола заключается в том чтобы по одному проводу передать 16 бит с управляющим значением для двигателя, а затем драйвер в ответ отправляет 16 бит со значением оборотов двигателя. Вот это знаечение и не получается получить.

image

 Написал вот такой индийский код и пытаюсь в прерывании таймера считывать в буфер поступающий пакет после получения отправляю его по UART.

void TIM4_IRQHandler(void)

{

/* USER CODE BEGIN TIM4_IRQn 0 */

 

/* USER CODE END TIM4_IRQn 0 */

HAL_TIM_IRQHandler(&htim4);

/* USER CODE BEGIN TIM4_IRQn 1 */

readeRPM ();

/* USER CODE END TIM4_IRQn 1 */

}

 

void readeRPM (){

if (flag == 1 ) // включется в прерывании после передачи пакета DMA

{

if((GPIOB->IDR & GPIO_PIN_6) == (uint32_t)GPIO_PIN_RESET) {

readStr = 1; // разрешенаем заполнение буфера

}

}

 

if(flag == 1 && readStr == 1) {

uint8_t val = (GPIOB->IDR & GPIO_PIN_6) >> 6;

(val > 0) ? (val |= 49) : (val |= 0);

*(str + i) = val;

if(i > 12) {

*(str + i + 1) = '\r';

*(str + i + 2) = '\n';

i = 0;

readStr = 0;

flag = 0;

HAL_UART_Transmit_IT(&huart1, (uint8_t*)str, 18); //отправляем по UART

}else{

i++;

}

}

}

На выходе получаю непонятную картину. 

image

У меня подозрения что вся проблема в прерываниях. Если дергать ногой в прерываниях таймера то получаем:

image

 Подскажите пожалуйста что делаю не так?

Цитата
Создатель темы Размещено : 05.05.2024 21:39
Aveal
(@aveal)
Top level Admin

Добрый день, первая мысль, что что-то не так с временными интервалами, но по факту, конечно, надо детально смотреть с отладчиком, анализатором итд

ОтветитьЦитата
Размещено : 07.05.2024 13:05
Поделиться: