Прошу совета по редактировании скетча при замене атмеги328 (uno) на 241к03( типа168 китайская нано)
- Войдите на сайт для отправки комментариев
Сб, 21/03/2020 - 00:15
суть такова
решил собрать регулятор оборотов для чпу
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 записываем новое значение
}
}
Нет, скетч менять не надо. У вас нет значений, зависящих от частоты осцилятора.
Возможно, прридется подкооектировать делители таймера в этой строке
TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS10);
На какой частоте работает ваша плата?
оо спасибо, значит я могу смело все спаивать и все заработает?
в данный момент стоит уно 238 все работает
я в программировании не ас, но знаю что уно 328 16 битная, а 168 8 бит , и знал что счетчик надо подредактировать где то в скетче ,,а где не знаю
328 и 168 обе 8-и битные. Да и вообще вся Mega и Tiny серии
но знаю что уно 328 16 битная, а 168 8 бит
Вообще неправильно. Они обе 8 битные, отличаются только объемом Flash-пямяти. Atmega328 - 32 килобайта, Atmega168 - 16 килобайт.
В строке 74 65536 тактов, но это для 16 бит
На любом микроконтроллере AVR (atmega, attiny) типы данных одинаковы. Переменная с типом int всегда будет 16 бит (2 байта).
я в программировании не ас, но знаю что уно 328 16 битная, а 168 8 бит
это бредятина, и 328 атмега и 168 - 8битные.
Только это вообще не имеет отношения к вашему скетчу.
Так все-таки, какеой контроллер у вас на плате. Если атмега328 или 168 - то скетч можно не менять, а если какой-то неведомый 241k03 - то с вероятностью 99% работать не будет
для пробы выбрал атмега 168 блинк загрузил ,,,работает
эту же прошивку загрузил ,,загрузилась , но пока не подпаял ее