Вс янв 12, 2020 11:55:39
void port_ini(void)
{
DDRD =0b10001000;
//PORTD=0b00000100;
PORTD=0b00000111;
}
void EncoderScan(void)
{
next_state = PIND & 0x05; // Берем текущее значение
// И сравниваем со старым
// Смотря в какую сторону оно поменялось -- увеличиваем
// Или уменьшаем счетный регистр
switch(prev_state)
{
case 4:
{
if(next_state == 5) up_state++;
if(next_state == 0) down_state++;
break;
}
case 0:
{
if(next_state == 4) up_state++;
if(next_state == 1) down_state++;
break;
}
case 1:
{
if(next_state == 0) up_state++;
if(next_state == 5) down_state++;
break;
}
case 5:
{
if(next_state == 1) up_state++;
if(next_state == 4) down_state++;
break;
}
}
prev_state = next_state; // Записываем новое значение
// Предыдущего состояния
if (up_state >= 4) // 1 раз за 4 импульса изменяем состояние передачи
{
sw++;
infoPage++; // Передача +
up_state = 0;
Light_timer=Light_Time;
}
if (down_state >= 4)
{
sw--;
infoPage--;
// Передача -
down_state = 0;
Light_timer=Light_Time;
}
}
void port_ini(void)
{
DDRD =0b10001000;
PORTD=0b00000111;
}
void int_ini(void)
{
MCUCR |= (1 << ISC01); // Прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // Очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // Разрешаем внешние прерывания INT0
}
ISR(INT0_vect)
{
next_state = PIND & 0x05;
switch(prev_state)
{
case 4:
{
if(next_state == 5) up_state++;
if(next_state == 0) down_state++;
break;
}
case 0:
{
if(next_state == 4) up_state++;
if(next_state == 1) down_state++;
break;
}
case 1:
{
if(next_state == 0) up_state++;
if(next_state == 5) down_state++;
break;
}
case 5:
{
if(next_state == 1) up_state++;
if(next_state == 4) down_state++;
break;
}
}
prev_state = next_state; // Записываем новое значение
// Предыдущего состояния
if (up_state >= 4) // 1 раз за 4 импульса изменяем состояние передачи
{
sw++;
infoPage++; // Передача +
up_state = 0;
Light_timer=Light_Time;
}
if (down_state >= 4)
{
sw--;
infoPage--;
// Передача -
down_state = 0;
Light_timer=Light_Time;
}
}
int main(void)
{
int_ini();//инициализируем внешние прерывания
port_ini(); //Инициализируем порты
LCD_ini(); //Инициализируем дисплей
I2C_Init(); //Инициализируем шину TWI (I2C)
PWM0_ini();//инициализируем PWM0
PWM1_ini();//Инициализируем 16 битный счетчик
PWM2_ini();//инициализиируем PWM2
// ISR(INT0_vect)
// {
//
// char EncCur = 0;
// if(!Pin_ENC_F1) EncCur = StateA; //опрос фазы 1 энкодера
// if(!Pin_ENC_F2) EncCur |= StateB; //опрос фазы 2 энкодера
// if(EncCur != EncPrev) //если состояние изменилось,
// {
// if(EncPrev == StateAB && //если предыдущее состояние StateAB
// EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны,
// {
// if(EncCur == StateB) //если текущее состояние StateB,
// {
// sw++;
// infoPage++; // Передача +
//
// Light_timer=Light_Time;
// }
// //шаг вверх
// else //иначе
// {
// sw--;
// infoPage--;
// // Передача -
//
// Light_timer=Light_Time;
// } //шаг вниз
// }
// EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния
// EncPrev = EncCur; //сохранение предыдущего состояния
// }
//
// }
Вс янв 12, 2020 13:33:23
Вс янв 12, 2020 15:49:11
Вс янв 12, 2020 18:19:10
это где?densir писал(а):вообщем
Вс янв 12, 2020 18:31:54
Пн янв 13, 2020 05:17:08
Пн янв 13, 2020 07:30:00
Пн янв 13, 2020 10:07:04
//Модуль поддержки энкодера
//Выходные сигналы энкодера подаются на порты ENC_F1 и ENC_F2.
//Кнопка энкодера подключена к порту ENC_SB.
//Используется программный опрос (поллинг). Функция Encoder_Exe()
//вызывается в основном цикле. При вращении энкодера или при изменении
//состояния кнопки в переменную Msg помещается код события.
//Этот код может быть считан с помощью функции Encoder_Msg().
//Подавление дребезга энкодера осуществляется на основе анализа стотояний.
//Переход между соседними состояниями не считается событием. Такая обработка
//возможна благодаря тому, что на один щелчок энкодера (на один период
//выходной последовательности) приходится 4 разных состояния.
//Подавление дребезга кнопки осуществляется путем проверки ее состояния
//в течение интервала SWDEBTM. Если состояние неизменно - дребезг закончился.
//При вращении производится счет шагов на интервале VMEASTM.
//Если измеренное количество шагов превышает пороговое значение MaxEncV,
//то формируются коды событий быстрого инкремента или декремента.
Пн янв 13, 2020 18:46:39
Пн янв 13, 2020 18:51:46
Вт янв 14, 2020 13:03:20
Угу. Причем осциллограммы 1-3 - это новый хороший энкодер. А 4-5 - это то, во что он превращается после нескольких тысяч оборотов. То есть, если его использовать реально, а не для "поиграть", то надо рассчитывать программу именно на осциллограммы 4 и 5. Алгоритм, заложенный в мою программу с этим справляется...DimAlt писал(а):Вот Вам реальные осциллограммы с китайского энкодера.
Вт янв 14, 2020 15:03:43
Вт янв 14, 2020 23:42:33
А подтянуть входы резисторами не забыл? Внутренняя подтяжка, если не врет мой склероз, порядка 50 кОм, что может быть приемлемо только для батарейных устройств с микропотреблением и без связи с электросетью, а для устройств с сетевым питанием 10 кОм - и то многовато, надо бы 4.7 кОм.densir писал(а):заметил, что простое касание корпуса иногда вызывают ложное срабатывание прерывания.
Одного конденсатора мало. Три резистора, диод и конденсатор. Общий провод энкодера на землю, каждый из контактов энкодера через 1 кОм на +5В, с него же через 1 кОм на параллельные диод и 10-100 кОм (подобрать), с них на вход. С этого же входа конденсатор (подобрать, навскидку -0.1 мкФ) на землю. Диод анодом на вход. Подтяжку входа не включать. Смысл такой цепочки - в положении "разомкнуто" конденсатор не торопясь зарядится через три последовательных резистора, скорости должно хватать для того, чтобы при нормальном вращении конденсатор успел зарядиться до следующего переключения (срабатывания второго контакта), но не успевал заметно заряжаться во время дребезга своего контакта (см. осциллограммы). При замыкании же конденсатор быстро разряжается через резистор 1 кОм (второй, который подбираем, зашунтирован диодом) и не успевает заметно зарядиться за время размыканий при дребезге. Скорее всего, такая схема будет прекрасно работать.densir писал(а):Пробовал добавлять конденсаторы между энкодером и землей - эффекта нет.
densir писал(а):код получился объемным, занял практически всю мегу32
:) Эти два высказывания противоречат друг другу.densir писал(а):использовать в моих поделках stm все равно что стрелять из пушки по воробьям.
Да там особой крутизны и не надо - ставишь Кейл, до 32К готовой прошивки он работает без лицензии. Далее бегло просматриваешь соответствующий RM (для F103 это RM0008), потом внимательно изучаешь те его разделы, где описана периферия, которую собираешься использовать, и вперед. Ну, еще прочитать PM0056, там описаны общеАРМовские фенечки, такие, как SysTick и NVIC...densir писал(а):А что касается перехода на stm я не на столько крутой)
Ср янв 15, 2020 00:51:25
Ср янв 15, 2020 10:06:40
An external incremental encoder can be connected directly to the MCU without external
interface logic. However, comparators are normally be used to convert the encoder’s
differential outputs to digital signals. This greatly increases noise immunity. The third
encoder output which indicate the mechanical zero position, may be connected to an
external interrupt input and trigger a counter reset.
Ср янв 15, 2020 17:06:59
Ср янв 15, 2020 18:11:54
но одного даташита для этого недостаточно. Лучше всего когда есть хороший учебник или учитель
Ср янв 15, 2020 22:24:11
Чт янв 16, 2020 09:26:00
Что представляет собой эта книга?
Учебник для студентов
Книга написана на основе многолетнего опыта преподавания курсов «Компьютерная и микропроцессорная техника в электроприводе», «Микропроцессорные средства в электроприводе», «Системы управления электроприводов», «Электропривод с вентильными и шаговыми двигателями» в Национальном исследовательском университете «МЭИ» для студентов электротехнических специальностей, а также практического опыта создания серий цифровых систем управления электроприводов и силовых преобразователей для отечественной промышленности.
Чт янв 16, 2020 13:47:43