Прошу совета по редактировании скетча при замене атмеги328 (uno) на 241к03( типа168 китайская нано)

el666
Offline
Зарегистрирован: 27.12.2019

суть такова

решил собрать регулятор оборотов для чпу

https://shenrok.blogspot.com/p/blog-page_80.html?showComment=1489156293398

нано платы не было ,решил временно использовать  уно (снял с чпу)

собрал , все отлично работает, пока собирал   друга попросил купить в городе  нано (фотку скинул  ему)

а там в магазине  ему фтюхали такую же плату  , но с чипом  не 328  а 241к03, это  типа атмега  168

и  вот сижу  репу чешу   , вернуть/поменять  плату  или все же можно отредактировать скетч  под 8 бит

В строке   57  написано   only для atmega328

В   строке 74 65536 тактов, но это для 16 бит

можно ли  где то что то отредактировать   или?

int obMin = 2000;          //ввести минимальные обороты
int obMax = 25000;         //ввести максимальные обороты
int kImp = 10;          //ввести кол-во импульсов на 10 оборотов
int minzn = 150;           //  минимальное значение симмистора на котором начинается вращение.
int ogrmin =  70 ;         // ограничение симистора на минимальных оборотах.
int mindimming = 80;        //значение симистора при закллинившем станке (первоначальный импульс)
int dopusk =  1000 ;         //допуск оборотов в минус и плюс

#include <LiquidCrystal.h>      // библиотека экрана

LiquidCrystal lcd( 12, 11, 7, 6, 5, 4 ); // пины экрана

int AC_LOAD = 3;    // пин управления симистором
volatile int dimming = 130;  // время задержки от нуля   7 = максимально, 130 = минимально
volatile unsigned long time; // время в микросекундах срабатывания датчика нуля
unsigned long tims;           // переменная показаний времени

unsigned long currentTime;     //временные переменные для таймера экрана
unsigned long loopTime;

int holl = 0;    //переменная  срабатываня датчика
int pR;                  // показания регулятора
int ogr ;                 //переменная ограничений симистора натекущих оборотах
volatile int sp = 0;           //переменная суммы срабатываний датчика
volatile int prOb ;   //предвар реальн обороты
volatile int rOb ;    // реальные обороты

volatile unsigned int int_tic;    //переменные для подсчёта времени между импульсами.
volatile unsigned long tic;
volatile int t = 0;               //минимальное время импульсов +1
int val ;
void setup()
{
  
  t = (15000 / ( obMin * (kImp / 10))) * 2; //высчитываем минимальное время импульсов +1
  pinMode(AC_LOAD, OUTPUT);        // назначаем выходом
  attachInterrupt(0, zero_crosss_int, RISING);  // прерывание по пину 2

  lcd.begin(16, 2);          //дисплей 16символов 2строчки
  lcd.setCursor(0, 0);

  lcd.write("R:");  //в верхней строке выводим время задержки

  lcd.setCursor(0, 1);

  lcd.write("t:");  // В нижней выводим показания датчика

  lcd.setCursor(8, 0);

  lcd.write("S:");  //в верхней строке будем выводить требуемые обороты

  lcd.setCursor(8, 1);

  lcd.write("S:");  // В нижней выводим фактичесские обороты


  pinMode (8, INPUT); // вход сигнала ICP( №8 only для atmega328)
  //настройка 16 бит таймера-счётчика 1
  TCCR1B = 0; TCCR1A = 0; TCNT1 = 0;
  TIMSK1 = (1 << ICIE1) | (1 << TOIE1); //создавать прерывание от сигнала на пине ICP1
  TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10); //div 1

}

ISR (TIMER1_CAPT_vect) { //прерывание захвата сигнала на входе ICP1
  tic = ((uint32_t)int_tic << 16) | ICR1 ; //подсчёт тиков
  ICR1 = 0; int_tic = 0; TCNT1 = 0;
  sp = sp + 1 ; // для подсчёта оборотов в минуту.
  holl = holl + 1;
}   // после каждого срабатывания датчика холл+1


ISR (TIMER1_OVF_vect) { //прерывание для счёта по переполнению uint
  int_tic++; //считать переполнения через 65536 тактов
  if (int_tic > t) {
    tic = 0;  //если на входе пусто более минимального времени то обнулить счётчики
    int_tic = 0;
  }
  if (int_tic > 500) {
    dimming = 130; // если стоим 2 секунды, то сбрасываем напряжение.
  }
}

// the interrupt function must take no parameters and return nothing
void zero_crosss_int()  // function to be fired at the zero crossing to dim the light
{
  time = micros();

}

void loop()  {


  val = analogRead(A0);
  pR = map(val, 0, 1023, obMin, obMax); //Приводим показания регулятора к минимальным и максимальным оборотам

  if (val > 0) {                                       //   если регулятор больше 0
    if ( holl >= 1) {                                  // если сработал датчик
      prOb = 60000000 / ((tic * 0.0625 ) * kImp / 10); //Высчитываем обороты по показаниям датчика
      if ( prOb >= 0) {                                //проверяем на соответствие.
        rOb = prOb ;                                   //если нормально, записываем в реальные обороты
      }
     
      ogr = map(val, 0, 1023, ogrmin, 7);              //исходя из показаний регулятора узнаём на сколько может быть открыт симистор.
      
      dimming = map(rOb, (pR - dopusk), (pR + dopusk), ogr, minzn); //рассчитываем управление симистором.
      holl = 0;                                                       // обнуляем срабатывание датчика
    }
    
    if (tic == 0) {                                    // если двигатель не вращается
      dimming = mindimming ;                          //  время задержки равно первоначальному импульсу
    }
    dimming = constrain(dimming, ogr, minzn) ;       //  Следим чтоб время задержки было не меньше ограничения и не больше минимального значения
  }
  else {
    dimming = 130;                                   //Если регулятор на 0 то время задержки 130
   
  }


  int dimtime = (75 * dimming);               // For 60Hz =>65
  tims = micros();                            // считываем время, прошедшее с момента запуска программы
  if (tims >= (time + dimtime)) {             //если время больше или равно времени срабатывания нуля + время задержки

    digitalWrite(AC_LOAD, HIGH);              // открываем симистор
    delayMicroseconds(10);                   // задержка 10 микросекунд (для 60Hz = 8.33)
    digitalWrite(AC_LOAD, LOW);              // выключаем сигнал на симистор.
  }
  else {}




  // Для вывода значений на дисплей 2 раз в секунду

  currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if (currentTime >= (loopTime + 500)) {            // сравниваем текущий таймер с переменной loopTime + 0,5 секунд

    // выводим показания датчика

    lcd.setCursor(2, 0);
    lcd.print(dimming );
    lcd.print("  ");     // выводим время задержки на экран.

    lcd.setCursor(2, 1);
    lcd.print(val );
    lcd.print("  ");     // выводим нужные обороты на экран.

    lcd.setCursor(10, 0);
    lcd.print(map(val, 0, 1023, obMin, obMax));
    lcd.print("       ");     // выводим нужные обороты на экран.

    lcd.setCursor(10, 1);

    lcd.print (sp * (1200 / kImp)); // выводим средние обороты на экран.
    lcd.print("       ");
    sp = 0;
   loopTime = currentTime;                         // в loopTime записываем новое значение
  }
}

 

Azathtot
Offline
Зарегистрирован: 17.03.2020

Нет, скетч менять не надо. У вас нет значений, зависящих от частоты осцилятора.
Возможно, прридется подкооектировать делители таймера в этой строке
TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10);
На какой частоте работает ваша плата?

el666
Offline
Зарегистрирован: 27.12.2019

оо спасибо,    значит   я могу  смело    все  спаивать  и  все   заработает?

в данный момент  стоит  уно 238  все  работает

el666
Offline
Зарегистрирован: 27.12.2019

я в  программировании не  ас, но  знаю что уно 328 16 битная, а  168 8 бит  , и знал что   счетчик   надо  подредактировать  где то в  скетче  ,,а  где  не  знаю

Azathtot
Offline
Зарегистрирован: 17.03.2020

328 и 168 обе 8-и битные. Да и вообще вся Mega и Tiny серии

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

el666 пишет:

но  знаю что уно 328 16 битная, а  168 8 бит 

Вообще неправильно. Они обе 8 битные, отличаются только объемом Flash-пямяти. Atmega328 - 32 килобайта, Atmega168 - 16 килобайт.

el666 пишет:

В   строке 74 65536 тактов, но это для 16 бит

На любом микроконтроллере AVR (atmega, attiny) типы данных одинаковы. Переменная с типом int всегда будет 16 бит (2 байта).

b707
Offline
Зарегистрирован: 26.05.2017

el666 пишет:

я в  программировании не  ас, но  знаю что уно 328 16 битная, а  168 8 бит

это бредятина, и 328 атмега и 168 - 8битные.

Только это вообще не имеет отношения к вашему скетчу.

Так все-таки, какеой контроллер у вас на плате. Если атмега328 или 168 - то скетч можно не менять, а если какой-то неведомый 241k03 - то с вероятностью 99% работать не будет

el666
Offline
Зарегистрирован: 27.12.2019

для пробы  выбрал атмега 168 блинк   загрузил  ,,,работает

el666
Offline
Зарегистрирован: 27.12.2019

эту же прошивку загрузил   ,,загрузилась   ,   но пока  не   подпаял ее