Блок управления на Arduino для лежачей БТГ.
8 года 5 мес. назад
8 года 5 мес. назад от tesla-nsk.
Автор темы
Блок управления на Arduino для лежачей БТГ. #48756
Эта тема создана для практиков, кто собирает своими руками управление БТГ на Arduino.
В этой теме выкладываются проекты (sketch) и обвес (shield) только для сборки управления БТГ на Arduino.
Приветствуются проекты (sketch) с пояснением команд на русском. Помним это русскоязычный ресурс и не все присутствующие понимают иную письменность.
В теме задаём вопросы по работе проекта автору проекта (sketch), но никогда не пишем, что это не работает, если не собрали проект своими руками.
Если собрали проект (sketch) и не работает, выясняем у автора проекта, почему не заработал проект. Выкладываем осциллограммы.
Отвечать или нет на вопросы это личное дело автора проекта - автор ни чем не обязан, это всего лишь хобби.
Никогда не пишем, что это не работает, если не собрали проект своими руками и не выложили осциллограммы.
Любые теории и расчеты, не подтверждённые автором поста на практике, отсюда удаляются.
В этой теме выкладываются проекты (sketch) и обвес (shield) только для сборки управления БТГ на Arduino.
Приветствуются проекты (sketch) с пояснением команд на русском. Помним это русскоязычный ресурс и не все присутствующие понимают иную письменность.
В теме задаём вопросы по работе проекта автору проекта (sketch), но никогда не пишем, что это не работает, если не собрали проект своими руками.
Если собрали проект (sketch) и не работает, выясняем у автора проекта, почему не заработал проект. Выкладываем осциллограммы.
Отвечать или нет на вопросы это личное дело автора проекта - автор ни чем не обязан, это всего лишь хобби.
Никогда не пишем, что это не работает, если не собрали проект своими руками и не выложили осциллограммы.
Любые теории и расчеты, не подтверждённые автором поста на практике, отсюда удаляются.
В мире есть только одно благо – знание, и есть только одно зло – невежество
/Сократ/
/Сократ/
Спасибо сказали kardinal3000
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
8 года 5 мес. назад
8 года 5 мес. назад от HIDE.
Блок управления на Arduino для лежачей БТГ. #49652
push-pull , проверен на UNO
Т.к. я недавно купил Ардуино, то компилирую в IDE 1.0.5
sketch
Т.к. я недавно купил Ардуино, то компилирую в IDE 1.0.5
sketch
ВНИМАНИЕ: Спойлер!
[ Нажмите, чтобы развернуть ]
[ Нажмите, чтобы скрыть ]
/*Скетч для Ардуино на мк atmega328 UNO
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,10,11,12,13);
void (*mas[4]) (void)={poluper1, dead_time1, poluper2, dead_time2}; // массив указателей функций
volatile int val_fr = 533; // длительность полупериода f=18000000/val_fr/2(Гц),
volatile int dead_time = 91; // пауза между периодами, не должна быть меньше 92 и больше val_fr-92
byte uk=0;
int f_val, d_val;
float rpm, dtm;
// ********************************************************************
// ********************************************************************
void setup() {
DDRD = B11111000; // нужные пины на выход
PORTD = B00000100; // на втором пине устанавливаем "единицу"
TCCR1A=0; TIMSK1=0; // сбрасываем на всякий эти регистры
// TCCR1A=0; TIMSK=0;
TCCR1B=0; // мало ли что arduino IDE туда записало
TCNT1=0; // сбрасываем счетный регистр таймера 1
OCR1A=0; // задаем частоту, в Гц, по формуле f=F_CPU/OCR1A/2 где F_CPU тактовая частота
TIMSK1|=(1<<OCIE1A); // разрешаем генерацию прерывания таймера 1, по совпадению с регистром OCR1A
// TIMSK|=(1<<OCIE1A);
// Скетч будет работать на дуинах с atmega168/328.
// При использовании atmega8 меняем все TIMSK1 на TIMSK (убираем еденицу).
TCCR1B|=((1<<CS10)|(1<<WGM12)); // запускаем таймер 1 без предделителя в режиме СТС
lcd.begin(16, 2);
lcd.print("arduino PushPull");
}
// ********************************************************************
// ********************************************************************
void loop(){
if ((PIND&(1<<2)) == 0) l_c_d(); // если на пин 2 лог 0
}
// ********************************************************************
// ********************************************************************
ISR(TIMER1_COMPA_vect) {
(*mas[uk])(); // вызываем функцию по указателю
}
// ********************************************************************
// ********************************************************************
// ********************************************************************
void poluper1(void) {
PORTD&=~(1<<5); // на пин 5 лог 0
PORTD|=(1<<4); // на пин 4 лог 1, формируем первый полупериод
if(dead_time<92) {OCR1A=val_fr; uk=2;} // если пауза меньше 92 тогда она формироваться не будет
else {OCR1A=val_fr-dead_time; uk=1;} // иначе уменьшаем полупериод на длительность паузы чтоб сохранить частоту
}
void dead_time1(void) {
PORTD&=~(1<<4); // на пинах 4 и 5 лог 0, формируем dead_time паузу
OCR1A=dead_time; uk=2;
}
void poluper2(void) {
PORTD&=~(1<<4); // на пин 4 лог 0
PORTD|=(1<<5); // на пин 5 лог 1, формируем второй полупериод
if(dead_time<92) {OCR1A=val_fr; uk=0;}
else {OCR1A=val_fr-dead_time; uk=3;}
}
void dead_time2(void) {
PORTD&=~(1<<5); // на пинах 4 и 5 лог 0, формируем dead_time паузу
OCR1A=dead_time; uk=0;
}
// ********************************************************************
// ********************************************************************
void l_c_d() {
// работаем с частотой от 15009(533) Гц до 30075(266) Гц (f=F_CPU/OCR1A/2)
// работаем с частотой от 20000(400) Гц до 30075(266) Гц (f=F_CPU/OCR1A/2)
f_val = analogRead(A3);
val_fr = map(f_val, 0, 1023, 533, 266);
rpm = 16000000.0/val_fr/2.0; // частота в Герцах
// работаем со скважностью
// пауза между периодами, не должна быть меньше 92 и больше val_fr-91
d_val = analogRead(A2);
int max_dt = val_fr-92;
dead_time = map(d_val, 0, 1023, 91, max_dt);
dtm = dead_time/(val_fr/100.0); // скважность в процентах
if (dead_time < 92) dtm=0;
lcd.setCursor(0, 0);
lcd.print("freq Hz");
lcd.setCursor(5, 0);
lcd.print(rpm);
lcd.setCursor(0, 1);
lcd.print("dead time %");
lcd.setCursor(10, 1);
lcd.print(dtm, 1);
//delay(400);
}
Спасибо сказали kardinal3000
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Модераторы: tesla-nsk
Время создания страницы: 0.063 секунд