Забыл еще одно условие: когда маятник отводится до предела, то замыкается на контакт и прибор весело мигает всеми лазерами сигнализируя о том, что маятник превысел предел отклонения. Маятник получается +, замыкается на порт.
я что-то вас перестаю понимать. Сначала были лазеры, потом индикаторные диоды. потом добавился контроль батарейки... теперь еще и маятник?
В итоге я так и не понял - вы код на железе пробовали? Режимы переключаются? Кнопки не залипают? Частота правильная?
Конечно попробовал. Кнопки не залипают. Режимы переключаются. Частота ровно 10 кГц со скважностью 50%.
Про лазеры, сигнальные диоды и контроль батарейки- все в шапке писал))). Просто сигнальные диоды у меня как то легко получается добавить самому в код Alexey_rem. А в последнем скетче он сам добавил их.
А про маятник забыл просто. Но это уже ладно. Вы и так помогли круто.
Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.
Контроллер питается прямо от батарейки или через какой-то стабилизатор,?Думаю при понижении питания смещается и уровень лог единицы очевидно схема со стабилитроном поможет
Стабилитрона нет пока. На плате стоит похоже такой делитель: диод и резюк 1кОм, на нем от 4v - 0.650v до 3.3v - 0.640v примерно было. Какой то маленький диапазон для измерения)
Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.
rastaman29 - По умолчанию analogRead() в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC
Для этого используется другая схема - на контроллере есть референсный уровень 1.1в. С помощью analogRead() измеряют этот референс относительно питания - и зная что он 1.1в - пересчитывают напряжение VCC.
Ищите код поиском по запросу "измерение напряжения питания ардуино"
rastaman29 - По умолчанию analogRead() в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC
Так а где вы видели в коде analogRead? Они пытаются измерять напряжение с помощью digitalRead
if(digitalRead(volt_sence)) //мигаем если сели батарейки
Только если включить импульсный режим, сигнальный светодиод разряда начинаем мигать с разным интервалом) и мигает даже при питании 3.6V изредка. И стабильно начинает мигать при снижении питания до 3.2v. Так же снизилась частота имп.режима и стабильно 10 кГц не делается.
Так же снизилась частота имп.режима и стабильно 10 кГц не делается.
потому что идея генератора за счет быстрых оборотов ЛУП работает только на относительно низких частотах. Чем больше вы наталкиваете в ЛУП дополнительных строчек - тем медленее он у вас крутится
Делайте на таймере, как в моем коде - получите точно 10кГц и от числа строчек в ЛУП зависеть не будет
Забыл еще одно условие: когда маятник отводится до предела, то замыкается на контакт и прибор весело мигает всеми лазерами сигнализируя о том, что маятник превысел предел отклонения. Маятник получается +, замыкается на порт.
я что-то вас перестаю понимать. Сначала были лазеры, потом индикаторные диоды. потом добавился контроль батарейки... теперь еще и маятник?
В итоге я так и не понял - вы код на железе пробовали? Режимы переключаются? Кнопки не залипают? Частота правильная?
Это как в анекдоте: дайте водицы испить, а то так кушать хочется, что переночевать негде ))))))
вот правильный loop [code] void loop() {if(digitalRead(volt_sence))//мигаем если сели батарейки { digitalWrite(pow_on_led, HIGH); } if ((micros()-time_r)>=50) { vibro=!vibro; time_r=micros(); control (); if(clk_cnt<=40) { clk_cnt++; } else { clk_cnt=0; modul(); if(indicat<=100) { indicat++; } else{ indicat=0; if(digitalRead(!volt_sence)) { digitalWrite(pow_on_led,!digitalRead(pow_on_led)); } } digitalWrite(modul_on,!modulation);// индицируем модуляцию } } } [/code]Конечно попробовал. Кнопки не залипают. Режимы переключаются. Частота ровно 10 кГц со скважностью 50%.
Про лазеры, сигнальные диоды и контроль батарейки- все в шапке писал))). Просто сигнальные диоды у меня как то легко получается добавить самому в код Alexey_rem. А в последнем скетче он сам добавил их.
А про маятник забыл просто. Но это уже ладно. Вы и так помогли круто.
Добавил int indicat=0;
Это как в анекдоте: дайте водицы испить, а то так кушать хочется, что переночевать негде ))))))
Именно так)) Потом руку оторву))
Отрывать руку дающую себе дороже
Это поддержать людей, которые так думают, они тоже делают вклад)))
а как лазеры должны включаться? 1->1+2->1+2+3 ?
1>1+2>1+2+3>2+3>1 в идеале
Попрообуй так:
[code] void control () { switch (selected) { case 0: digitalWrite(lazer_1, vibro||modulation); break; case 1: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 2: digitalWrite(lazer_3, vibro||modulation); digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 3: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_3, vibro||modulation); break; } } [/code]Получилось так 1>1+2>1+2+3>1
Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.
Поставь код который в сообщении была ошибка я ее убрал
int pow_on_led=(3);//св диод питания вставить свою ногу int volt_sence=(6); //датчик напр питания вставить свою ногу int modul_on=(4);//св диод вкл модуляции вставить свою ногу unsigned long time_r; boolean modulation=true; boolean vibro=false; boolean modul_debunc=false; int modul_cnt=0; int indicat=0; boolean select_debunc=false; boolean sel_pressed=false; boolean mod_pressed=false; int select_cnt=0; int clk_cnt=0; int selected=0; int lazer_1=9; int lazer_2=10; int lazer_3=11; int butt_select=2; int butt_modul=5; void control () { switch (selected) { case 0: digitalWrite(lazer_1, vibro||modulation); break; case 1: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 2: digitalWrite(lazer_3, vibro||modulation); digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 3: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_3, vibro||modulation); break; /* switch (selected) { case 4: digitalWrite(lazer_1, vibro||modulation); digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_3, vibro||modulation); }*/ } } void press_chk() { if(digitalRead(butt_select)) { sel_pressed=false; } if(digitalRead(butt_modul)) { mod_pressed=false; } } void lazer_selection() { digitalWrite(lazer_1, LOW); digitalWrite(lazer_2, LOW); digitalWrite(lazer_3, LOW); if(selected<2) { selected++; } else { selected=0; } } void modul() { if(!modul_debunc) { if(!digitalRead(butt_modul)&&! mod_pressed) { modul_debunc=true; mod_pressed=true; modulation=!modulation; } } else { if(modul_cnt<=90) { modul_cnt++; } else { modul_cnt=0; modul_debunc=false; } } if(!select_debunc) { if(!digitalRead(butt_select)&&!sel_pressed) { select_debunc=true; sel_pressed=true; lazer_selection(); } } else { if(select_cnt<=90) { select_cnt++; } else { select_cnt=0; select_debunc=false; } } if(sel_pressed||mod_pressed) { press_chk(); } } void setup() { pinMode(lazer_1,OUTPUT); pinMode(lazer_2,OUTPUT); pinMode(lazer_3,OUTPUT); pinMode(pow_on_led,OUTPUT); pinMode(modul_on,OUTPUT); pinMode(butt_select,INPUT_PULLUP); pinMode(butt_modul,INPUT_PULLUP); pinMode(volt_sence,INPUT); digitalWrite(pow_on_led, LOW); digitalWrite(lazer_1, LOW); digitalWrite(lazer_2, LOW); digitalWrite(lazer_3, LOW); } void loop() { if(digitalRead(volt_sence)) //мигаем если сели батарейки { digitalWrite(pow_on_led, LOW); } if ((micros()-time_r)>=42) { vibro=!vibro; time_r=micros(); control (); if(clk_cnt<=40) {clk_cnt++; } else {clk_cnt=0; modul(); if(indicat<=100) { indicat++; } else { indicat=0; if(digitalRead(!volt_sence)) { digitalWrite(pow_on_led,!digitalRead(pow_on_led)); } } digitalWrite(modul_on, modulation);// индицируем модуляцию } } }Со всеми исправлениями.
Контроллер питается прямо от батарейки или через какой-то стабилизатор,?Думаю при понижении питания смещается и уровень лог единицы очевидно схема со стабилитроном поможет
Контроллер питается напрямую от батарейки. Стабилитрон найду ща.
и еще в строке 66:
вместо
if(selected<2)//Все чётко переключается.
Стабилитрона нет пока. На плате стоит похоже такой делитель: диод и резюк 1кОм, на нем от 4v - 0.650v до 3.3v - 0.640v примерно было. Какой то маленький диапазон для измерения)
Сейчас тестировал sens. Получается при питании 4v, sens начинает мигать при 1.89v. Выставил примерно 2v на sens при пит 4v. А если понижать питание, то видимо смещается и sens, так как даже при питании 3.3v на sens уже почти 1.5v и диод не мигает.
rastaman29 - По умолчанию analogRead() в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC
Для этого используется другая схема - на контроллере есть референсный уровень 1.1в. С помощью analogRead() измеряют этот референс относительно питания - и зная что он 1.1в - пересчитывают напряжение VCC.
Ищите код поиском по запросу "измерение напряжения питания ардуино"
Спасибо. Почитаю.
rastaman29 - По умолчанию analogRead() в ардуино измеряет ОТНОСИТЕЛЬНО ПИТАНИЯ, поэтому просто так измерить им VCC той ардуиной, что сама от него питается - нельзя, будет всегда примерно максимум ADC
Так а где вы видели в коде analogRead? Они пытаются измерять напряжение с помощью digitalRead
Сегодня не получится поэкспериментировать. Забыл на работе всё.
Они пытаются измерять напряжение с помощью digitalRead
Простите, не заметил.
тогда без меня
А как без ошибок)
[code] #include <MsTimer2.h> #define MEASURE_PERIOD 500 // время периода измерения #define R1 1. // сопротивление резистора R1 #define R2 20. // сопротивление резистора R2 uint16_t raw_bandgap = 0; // значение внутреннего bandgap float volt_battery = 0.0; int pow_on_led=(3);//св диод питания вставить свою ногу int volt_sence=(A0); //датчик напр питания вставить свою ногу int inputCod; //код входного напряжения float inputVoltage; //входное напряжение в В int modul_on=(4);//св диод вкл модуляции вставить свою ногу int timeCount; // счетчик времени float u1, u2; // измеренные напряжения unsigned long time_r; boolean modulation=true; boolean vibro=false; boolean modul_debunc=false; int modul_cnt=0; int indicat=0; boolean select_debunc=false; boolean sel_pressed=false; boolean mod_pressed=false; int select_cnt=0; int clk_cnt=0; int selected=0; int lazer_1=9; int lazer_2=10; int lazer_3=11; int butt_select=2; int butt_modul=5; void control () { switch (selected) { case 0: digitalWrite(lazer_1, vibro||modulation); break; case 1: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 2: digitalWrite(lazer_3, vibro||modulation); digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_1, vibro||modulation); break; case 3: digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_3, vibro||modulation); break; /* switch (selected) { case 4: digitalWrite(lazer_1, vibro||modulation); digitalWrite(lazer_2, vibro||modulation); digitalWrite(lazer_3, vibro||modulation); }*/ } } void press_chk() { if(digitalRead(butt_select)) { sel_pressed=false; } if(digitalRead(butt_modul)) { mod_pressed=false; } } void lazer_selection() { digitalWrite(lazer_1, LOW); digitalWrite(lazer_2, LOW); digitalWrite(lazer_3, LOW); if(selected<3) { selected++; } else { selected=0; } } void modul() { if(!modul_debunc) { if(!digitalRead(butt_modul)&&! mod_pressed) { modul_debunc=true; mod_pressed=true; modulation=!modulation; } } else { if(modul_cnt<=90) { modul_cnt++; } else { modul_cnt=0; modul_debunc=false; } } if(!select_debunc) { if(!digitalRead(butt_select)&&!sel_pressed) { select_debunc=true; sel_pressed=true; lazer_selection(); } } else { if(select_cnt<=90) { select_cnt++; } else { select_cnt=0; select_debunc=false; } } if(sel_pressed||mod_pressed) { press_chk(); } } void timerInterupt() { timeCount++; } void setup() { pinMode(lazer_1,OUTPUT); pinMode(lazer_2,OUTPUT); pinMode(lazer_3,OUTPUT); pinMode(pow_on_led,OUTPUT); pinMode(modul_on,OUTPUT); pinMode(butt_select,INPUT_PULLUP); pinMode(butt_modul,INPUT_PULLUP); pinMode(volt_sence,INPUT); digitalWrite(pow_on_led, LOW); digitalWrite(lazer_1, LOW); digitalWrite(lazer_2, LOW); digitalWrite(lazer_3, LOW); MsTimer2::set(1, timerInterupt); // прерывания по таймеру, период 1 мс MsTimer2::start(); // разрешение прерывания analogReference(INTERNAL); Serial.begin(115200); } void loop() { if ( timeCount >= MEASURE_PERIOD ) { timeCount= 0; u1= ((float)analogRead(volt_sence)) * 1.1 / 1024. / R2 * (R1 + R2); Serial.print("U1 = "); Serial.print(u1, 2); Serial.print(" U2 = "); Serial.println(u2, 2); } //if(analogRead(volt_sence)) //мигаем если сели батарейки if(u1 >= 0.68) { digitalWrite(pow_on_led, LOW); } if ((micros()-time_r)>=42) { vibro=!vibro; time_r=micros(); control (); if(clk_cnt<=40) {clk_cnt++; } else {clk_cnt=0; modul(); if(indicat<=100) { indicat++; } else { indicat=0; // inputCod= analogRead(volt_sence); // чтение напряжения на входе A0 //inputVoltage= ( (float)inputCod * 5. / 1024. ); // пересчет кода в напряжение (В) if(u1 <= 0.68) { //Serial.print(inputVoltage); digitalWrite(pow_on_led,!digitalRead(pow_on_led)); } } digitalWrite(modul_on, modulation);// индицируем модуляцию } } } [/code]Вроде получилось заставить мигать диод при падении питания 3.5v и ниже.
Только если включить импульсный режим, сигнальный светодиод разряда начинаем мигать с разным интервалом) и мигает даже при питании 3.6V изредка. И стабильно начинает мигать при снижении питания до 3.2v. Так же снизилась частота имп.режима и стабильно 10 кГц не делается.
Спасибо b707 за наводку.
Так же снизилась частота имп.режима и стабильно 10 кГц не делается.
потому что идея генератора за счет быстрых оборотов ЛУП работает только на относительно низких частотах. Чем больше вы наталкиваете в ЛУП дополнительных строчек - тем медленее он у вас крутится
Делайте на таймере, как в моем коде - получите точно 10кГц и от числа строчек в ЛУП зависеть не будет
Попробую Ваш код. Но у вас сложнее разобраться.