Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
780e19943d | ||
|
|
b328b6b73c | ||
|
|
ad1e1be6d0 | ||
|
|
72118c57ce | ||
|
|
881dedfe20 | ||
|
|
42b0b05734 | ||
|
|
6fc6bd447f | ||
|
|
fc22e4a984 | ||
|
|
6dd3fd5a15 |
@@ -0,0 +1 @@
|
|||||||
|
ad1e1be6d08e7e2027afc226be1e6c02bcd442b0
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# 🤖 Технический контекст проекта (Сгенерировано ИИ)
|
||||||
|
|
||||||
|
### README для репозитория
|
||||||
|
|
||||||
|
**1. Краткое назначение проекта.**
|
||||||
|
Проект содержит исходный код файла DS_Encoder.c, который предназначен для разработки компонента, отвечающего за кодирование данных.
|
||||||
|
|
||||||
|
**2. Тип стека.**
|
||||||
|
Библиотека с реализацией кодирования данных (DS_Encoder).
|
||||||
|
|
||||||
|
**3. Архитектурный разбор:**
|
||||||
|
- Файл Src/DS_Encoder.c — содержит реализацию компонента для кодирования данных.
|
||||||
|
|
||||||
|
<!-- USER_CUSTOM_CONTEXT_START -->
|
||||||
|
# ✍️ Заметки разработчика
|
||||||
|
*Допишите сюда свои требования, и ИИ учтет их при следующем запуске*
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
#ifndef DS_ENCODER_H
|
||||||
|
#define DS_ENCODER_H
|
||||||
|
|
||||||
|
#ifdef STM32G030xx
|
||||||
|
#include "stm32g0xx_hal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef STM32F030xx
|
||||||
|
#include "stm32f0xx_hal.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct DS_Encoder
|
||||||
|
{
|
||||||
|
GPIO_TypeDef *PortEncSignal1, *PortEncSignal2;
|
||||||
|
uint16_t PinEncSignal1, PinEncSignal2;
|
||||||
|
int8_t State;
|
||||||
|
int8_t Direction;
|
||||||
|
uint32_t PrevTick;
|
||||||
|
|
||||||
|
uint8_t ValueSignal1, ValueSignal2;
|
||||||
|
TIM_HandleTypeDef *hTim;
|
||||||
|
}DS_Encoder;
|
||||||
|
|
||||||
|
void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim);
|
||||||
|
|
||||||
|
void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef* PortEncSignal1, uint16_t PinEncSignal1, GPIO_TypeDef* PortEncSignal2, uint16_t PinEncSignal2);
|
||||||
|
|
||||||
|
void DS_EncoderUpdate(DS_Encoder *Encoder);
|
||||||
|
|
||||||
|
int8_t DS_EncoderGetState(DS_Encoder *Encoder);
|
||||||
|
|
||||||
|
#endif //DS_ENCODER_H
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
#include "Encoder.h"
|
||||||
|
|
||||||
|
void DS_EncoderInitTim(DS_Encoder *Encoder, TIM_HandleTypeDef *hTim)
|
||||||
|
{
|
||||||
|
Encoder->hTim = hTim;
|
||||||
|
Encoder->State = 0;
|
||||||
|
HAL_TIM_Encoder_Start(hTim, TIM_CHANNEL_ALL);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void DS_EncoderInit(DS_Encoder *Encoder, GPIO_TypeDef *PortEncSignal1, uint16_t PinEncSignal1, GPIO_TypeDef *PortEncSignal2, uint16_t PinEncSignal2)
|
||||||
|
{
|
||||||
|
Encoder->hTim = 0;
|
||||||
|
Encoder->Direction = 0;
|
||||||
|
Encoder->State = 0;
|
||||||
|
Encoder->PrevTick = HAL_GetTick();
|
||||||
|
Encoder->PinEncSignal1 = PinEncSignal1;
|
||||||
|
Encoder->PinEncSignal2 = PinEncSignal2;
|
||||||
|
Encoder->PortEncSignal1 = PortEncSignal1;
|
||||||
|
Encoder->PortEncSignal2 = PortEncSignal2;
|
||||||
|
|
||||||
|
Encoder->ValueSignal1 = 0;
|
||||||
|
Encoder->ValueSignal2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DS_EncoderUpdate(DS_Encoder *Encoder)
|
||||||
|
{
|
||||||
|
uint32_t CurrentTick = HAL_GetTick();
|
||||||
|
if ((CurrentTick - Encoder->PrevTick) < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Encoder->PrevTick = CurrentTick;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Обновление состояние первой сигнальной линии
|
||||||
|
GPIO_PinState Pin1State = HAL_GPIO_ReadPin(Encoder->PortEncSignal1, Encoder->PinEncSignal1);
|
||||||
|
if (Pin1State == GPIO_PIN_SET)
|
||||||
|
{
|
||||||
|
Encoder->ValueSignal1 = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Encoder->ValueSignal1 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Обновление состояние второй сигнальной линии
|
||||||
|
GPIO_PinState Pin2State = HAL_GPIO_ReadPin(Encoder->PortEncSignal2, Encoder->PinEncSignal2);
|
||||||
|
if (Pin2State == GPIO_PIN_SET)
|
||||||
|
{
|
||||||
|
Encoder->ValueSignal2 = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Encoder->ValueSignal2 = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Рассчитываем в какую сторону повернули энкодер
|
||||||
|
// Если на первой линии высокий уровень, а на второй линии - низкий, то вращаем в одну сторону
|
||||||
|
if(Encoder->ValueSignal1 == 1 && Encoder->ValueSignal2 == 0)
|
||||||
|
{
|
||||||
|
Encoder->Direction = 1;
|
||||||
|
}
|
||||||
|
// Если на первой линии низкий уровень, а на второй линии - высокий, то вращаем в другую сторону
|
||||||
|
if(Encoder->ValueSignal1 == 0 && Encoder->ValueSignal2 == 1)
|
||||||
|
{
|
||||||
|
Encoder->Direction = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// как определились с направлением - ждём когда оба сигнала поднимутся в высокий уровень, фиксируем шаг, и сбрасываем флаг направления.
|
||||||
|
if(Encoder->Direction != 0 && Encoder->ValueSignal1 == 1 && Encoder->ValueSignal2 == 1)
|
||||||
|
{
|
||||||
|
Encoder->State = Encoder->State + Encoder->Direction;
|
||||||
|
Encoder->Direction = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
int8_t DS_EncoderGetState(DS_Encoder *Encoder)
|
||||||
|
{
|
||||||
|
if (Encoder->hTim != 0)
|
||||||
|
{
|
||||||
|
int8_t CurrentCounter = ((int16_t)Encoder->hTim->Instance->CNT) / 4;
|
||||||
|
int8_t ValueToReturn = CurrentCounter - Encoder->State;
|
||||||
|
Encoder->State = CurrentCounter;
|
||||||
|
|
||||||
|
return ValueToReturn;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int8_t ValueToReturn = Encoder->State;
|
||||||
|
Encoder->State = 0;
|
||||||
|
return ValueToReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user