Обсуждаем контроллеры компании Atmel.
Ответить

реверс двигателя на Attiny13

Чт ноя 28, 2019 12:24:36

Здраствуйте! Написал програмулю для управления мотором, но никак не могу реализовать работу таймеров чтоб избавится от delay.
Это моя первая программа так что сильно не ругайте. Написано с помощью AtmelStudio 7.
В протеусе вроде работает.


Спойлер
Код:
//Реверс для асинхронного двигателя стиральной машины

#define F_CPU 1200000UL
#define REL_PWR PB0       // пин реле питания
#define REL_RVS PB2       // пин реле реверса   
#define LED_OUT PB4       // пин светодида работы
#define LED_IN PB3        // пин светодида питания
#define BUTTON PB1        // пин кнопки
#define WORK 23000        //время работы (около 30 сек)
#define countWORK 10      //количество циклов работы
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsigned char i=0, count=0, statePWR=0;

void LEFT () {
   if (statePWR)   {
     PORTB &= ~(1<<REL_PWR);   //выкл питание
     _delay_ms (500);          //пауза
    PORTB &= ~(1<<REL_RVS);   //выкл реверс
     _delay_ms (500);          //пауза   
     PORTB |= (1<<REL_PWR);    //запуск 
    }
}
void RIGHT () {
    if (statePWR)   {
   PORTB &= ~(1<<REL_PWR);      //выкл питание
    _delay_ms (500);             //пауза   
    PORTB |= (1<<REL_RVS);       //включить реверс
    _delay_ms (500);             //пауза
    PORTB |= (1<<REL_PWR);       //запуск
    }           
}
void STOP () {
    if (statePWR)   {
   PORTB &= ~(1<<REL_PWR);      //выкл питание
    _delay_ms (100);             //пауза
    PORTB &= ~(1<<REL_RVS);      //выкл реверс
    }
}

ISR(PCINT0_vect)
{
   _delay_ms (50);
   if (statePWR) {                       //если включено
      if (!(PINB & (1<<BUTTON))) {      //если нажата кнопка
         _delay_ms(30);
         STOP();         
      }
   }
}   
   
int main(void) {
  // кнопоки
  DDRB &= ~(1<<BUTTON);                                        // вход
  PORTB |= (1<<BUTTON);                                        // подтянут
  // выходы
  DDRB |= (1<<REL_PWR)|(1<<REL_RVS)|(1<<LED_OUT)|(1<<LED_IN);  // выход
  PORTB &= ~((1<<REL_PWR)|(1<<REL_RVS)|(1<<LED_OUT));          // выкл
  PORTB |= (1<<LED_IN);
 
  GIMSK |= (1<<PCIE)|(1<<INT0);     // Разрешаем внешние прерывания PCINT0.
  GIFR |=(1<<INTF0);
  PCMSK |= (1<<BUTTON);            // Разрешаем по маске прерывания на ногах кнопки
  sei();                           // Разрешаем прерывания глобально

    while (1)
    {      
       if (!statePWR) {                              //если не включено
         if (!(PINB & (1<<BUTTON))) {                //если нажата кнопка
           count++;                                  //увеличиваемся
          _delay_ms(30);                       
         }
         if (PINB & (1<<BUTTON)) {                   //если кнопка отпущена
          _delay_ms(10);
          count=0;                                 //сброс счета   
         }   
          if (count>=60) {                                 //если длительное нажатие > 2 сек
            count=0;                                       //сброс   
               statePWR = 1;                                  //флаг на запуск
            PORTB &= ~(1<<LED_IN);                         //выкл индикации питания
            PORTB |= (1<<LED_OUT);                         //вкл индикации работы
              for (i=0; i<countWORK; i++) { 
                LEFT();                                   //запуск ВЛЕВО
                _delay_ms(WORK);
                RIGHT();                                  //запуск ВПРАВО
                _delay_ms(WORK);
              }
            STOP();                                       // СТОП ВСЕМУ
            statePWR = 0;                                 //сброс флага запуска
            PORTB &= ~(1<<LED_OUT);                       //гасим индикацию работы
            PORTB |= (1<<LED_IN);                         //вкл индикации питания            
           }
        }
        }                   
}
Вложения
проектAtmelStudio.rar
(21.62 KiB) Скачиваний: 266
файл протеуса.rar
(21.15 KiB) Скачиваний: 224

Re: реверс двигателя на Attiny13

Пт ноя 29, 2019 06:17:49

Имена функций строчными. Аргументы (скобки) без пробела. Выравнивание, отступы, табуляция... Вы в школе тоже так писали? Это оформление.
Зачем избавляться от делай?
Зачем прерывания?

Re: реверс двигателя на Attiny13

Пт ноя 29, 2019 10:54:51

...Написал програмулю...

Что и как должна делать?
brusel2 писал(а):...вроде...

Не надо вроде, надо так-то и так-то.

Re: реверс двигателя на Attiny13

Пт ноя 29, 2019 13:12:52

Попытка сделать без “delay” :)
Вложения
noDelay.zip
(27.63 KiB) Скачиваний: 215

Re: реверс двигателя на Attiny13

Пт ноя 29, 2019 15:35:31

wss60, Спасибо Вам огромное за проделанную работу. Если Вам не трудно, можете добавить функцию "Остановка" по кратковременному нажатии кнопки. В моем варианте было по ISR(PCINT0_vect).
Проверил в протеусе все работает.

Re: реверс двигателя на Attiny13

Сб ноя 30, 2019 13:54:36

Добавил.
Должно работать :)
Вложения
noDelay2.zip
(1.67 KiB) Скачиваний: 202

Re: реверс двигателя на Attiny13

Пт дек 27, 2019 21:10:16

Вернусь к своему вопросу. Собрал все в железе, загрузил тиньку прошивкой от wss60, но хочу сказать что есть непонятные косяки: циклы сбиваются, по времени неравномерные, после остановки, вооще не запускается, хотя в симуляторе работает нормально.
В своей версии убрал код с прерыванием, загрузил, и работает с delay все четко без ошибок.
Подскажите что и как добавить, чтоб при кратковременном нажатии кнопки, программа заканчивала работу.

Re: реверс двигателя на Attiny13

Пт дек 27, 2019 21:20:25

Конденсатор параллельно кнопки на 0.1мкф стоит?
Версия 2.0 :)
Вложения
2.0.zip
(1.82 KiB) Скачиваний: 203
Ответить