Микроконтроллер для БТГ
В этом то и весь компот, что для возбуждения колебаний в катушке подается импульс прямоугольной формы.Kebato пишет: Синус - это самое главное , мы же хотим создать гармонические колебания (резонанс)... Кварц на обеих МК 32 и 328 по 20МГц. В том числе включил энкодер, оба МК связанны между собой через SPI.
Хотя надо начинать с принципиальной схемы, которую Вы хотите реализовать.
Тогда и можно что то обсуждать.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Какой алгоритм?Abadiya пишет:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]Mining пишет:
Кому то достаточно и прошивки рабочей, но для развития проекта полезно алгоритм и код.Abadiya пишет:
Нам прошивка не нужна! Нам нужен код и алгоритм! Не хочешь давать? Не надо...... Мы сами с усами, и без тебя обойдёмсяKebato пишет: для себя и для вас только готовую прошивку.
ЗЫ. На твоих фото все больно мудрено. Это все решается намного проще при правильном подходе. Удачи
Abadiya, Вы же занимаетесь Ардуино, не пробовали реализовать подобное на Ардуино?
Тем более есть практический опыт разгона UNO до 27мегаГерц .
Я по началу тоже думал, что не хватает скорости процессора. прикупил Arduino Due ( 32 bit Description/Function: 512 kB flash memory, 96 kB SRAM, 84 MHz clock speed)
Теперь Всего хватает, скорости и памяти. БТГ не работает! Выкладывать нечего, все мусор
Abadiya, для начала на Arduino Due надо создать два генератора прямоугольных импульсов с возможностью точной регулировки частоты, скважности и сдвиг фазы.
Вот уже писал здесь:
Для меня реализацию на МК я вижу два варианта в два этапа.
Вариант 1. Ручной режим.
1.Создать генератор прямоугольных импульсов для Push-pull.
1.1.Частота от0до60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц(лучший вариант 0,01Гц).
1.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.Создать генератор прямоугольных импульсов для накачки Тесла.
2.1. Частота от 1,0 до 2,0 МГЦ, ручная регулировка энкодером с минимальным шагом 0,1 Гц (лучший вариант 0,01Гц).
2.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.3 Сдвиг фазы регулируемый, ручной режим энкодером с минимальным шагом 1о
Вариант 2. Ручной режим.
1.Создать генератор прямоугольных импульсов для push-pull.
1.1.Частота от 0до60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц(лучший вариант 0,01Гц).
1.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.Создать генератор нано-импульсов.
2.1. Частота в диапазоне push-pull от 0 до 60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц (лучший вариант 0,01Гц).
2.2.Длительность импульса от 10 до 300Нс(можно от 50 до 200Нс), ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.3 Сдвиг фазы регулируемый, ручной режим энкодером с минимальным шагом 1о
Все параметры вывожу на двустрочный дисплей типа Lcd1602
(Использую Arduino 1602 LCD KeyPad Shield)
В меню вхожу с помощью кнопок.
После того как в ручном режиме получаю эффект работы установки без вмешательства от внешней подпитки и тогда Второй этап сделать обратные связи для автоподстройки.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Повторюсь: - Не мешайте молодым жить!radioman пишет:
Открою таки вам страшную тайнуGeorgievic пишет:
Вот этим и закончится, поскольку желание приспособить к незнакомой сфере электроники свои хорошие знания и возможности в области микроконтроллеров превалируют над прописной истиной - не ставь телегу впереди лошади! Для эксперментов со схемой Д. Смита, Лии, Тайгера ит.д. достаточно схемы ФАПЧ с ударным возбуждением первички на рассыпухе серии 1533 и 597СА2.Abadiya пишет: Теперь Всего хватает, скорости и памяти. БТГ не работает! Выкладывать нечего, все мусор
Для работы и экспериментов с указанными схемами вообще ни одной цифровой микросхемы не требуется.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Теорий много, но мы сейчас занимаемся практикой, а на этом этапе достаточно схемного решения и методики пуско-наладкиKebato пишет: Уважаемый Дед Mining (Горец), Сначала - Теорию, принцип получения (трансформации) энергии эфира в электрическую, возможно потом и схему, я планирую обсуждать и делится своим опытом только с достойными, трудолюбивыми специалистами в данной сфере. Тот кто соберёт для начала предлагаемую мною схему на микроконтроллере , как минимум получит для себя полезный в будущем прибор (для настройки , наладки других приборов), включительно станет одним из членов моего клуба, там где профессионалы и максимально ответственные за свои поступки. Так как Справедливость в Космосе - первостепенна!
Вопрос про схему у меня возник когда я увидел, что в Вашем контроллере для БТГ вы сделали синус.
Но для раскачки эффективны прямоугольные импульсы. И их используют в основном на realstrannik . Здесь присутствуют схемные решения генераторов для БТГ с прямоугольной генерацией сигнала, то я предположил, что Вы делаете что то иначе.
Ну, тут уже без схемы никак.
Спасибо за Ваше предложение. Но я как радиолюбитель со стажем надеюсь еще что то не только собрать , но и запустить.Kebato пишет: Уважаемый Дед Mining, вы у нас в наблюдательном совете, Аксакал,и один готовый генератор серийного производства я планирую отправить Вам, будущем, в знак признательности, если вы не против. Благодарю Вас за поддержку.
Справедливо будет - обмен. Я Вам своё изделие отправлю, а Вы мне своё
Удачи и Сибирского здоровья Вам!
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Посмотри на этот код.Mining пишет: Для меня реализацию на МК я вижу два варианта в два этапа.
Вариант 1. Ручной режим.
1.Создать генератор прямоугольных импульсов для Push-pull.
1.1.Частота от0до60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц(лучший вариант 0,01Гц).
1.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.Создать генератор прямоугольных импульсов для накачки Тесла.
2.1. Частота от 1,0 до 2,0 МГЦ, ручная регулировка энкодером с минимальным шагом 0,1 Гц (лучший вариант 0,01Гц).
2.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.3 Сдвиг фазы регулируемый, ручной режим энкодером с минимальным шагом 1о
Вариант 2. Ручной режим.
1.Создать генератор прямоугольных импульсов для push-pull.
1.1.Частота от 0до60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц(лучший вариант 0,01Гц).
1.2.Скважность регулируемая, ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.Создать генератор нано-импульсов.
2.1. Частота в диапазоне push-pull от 0 до 60кГц, ручная регулировка энкодером с минимальным шагом 0,1 Гц (лучший вариант 0,01Гц).
2.2.Длительность импульса от 10 до 300Нс(можно от 50 до 200Нс), ручной режим энкодером с минимальным шагом 0,1% (лучший вариант 0,01%).
2.3 Сдвиг фазы регулируемый, ручной режим энкодером с минимальным шагом 1о
После того как в ручном режиме получаю эффект работы установки без вмешательства от внешней подпитки и тогда Второй этап сделать обратные связи для автоподстройки.
2 канала; 30-60 кГц с шагом 1 Гц; 2-й канал с синхронизацией; управление- 3 кнопки; Все параметры выводятся на PC терминал.
1. Выход на Push-pull - аппаратный ШИМ ATMega: регулировка частоты + ширина импульса
2. Этот же выход идёт на 2 аппаратных прерывания, по подъёму и спаду для 2-х полупериодов, так же сигнал на для Tesla. Регулируется смещение от начала фронта основного сигнала (Push-pull), регулируется ширина импульса+ пачки импульсов 1-** если включена пачка импульса, то отдельно регулируется пауза между импульсами.
3. Включить / отключить пачки импульсов в противофазе на втором полупериоде
/*
Copyright release under LGPL (GNU General Public License), as well as a non-commercial use.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
For legal advice on subjects of Copyright, Trademarks and Patents please consult
legal counsel at myattorneyusa.com
*/
#include "CyberLib.h"
#include <PWM.h>
//byte pin1=4, pin2=5, pin3=6; // pin кнопок
bool p1, p2, p3;
int pwm = 9; // pwm out Push-pull
int32_t f=100;
int duty=128;
int shift=1;
int dutyTT=1;
int packet=1;
int packet_del=1;
int pac=0;
int cycle=0;
bool success;
int mode=1;
// 1 - частота ШИМ
// 2 - ширина ШИМ
// 3 - Сдвиг 2-го импульса
// 4 - Ширина 2-го импульса
// 5 - Количество импульсов
// 6 - пауза между импульсами
// 7 - вкл/выкл противофазы
void setup()
{
Serial.begin(115200);
Serial.println("Init device");
Serial.println("mode: PWM Frequency HZ");
InitTimersSafe();
bool success = SetPinFrequencySafe(pwm, f);
D10_Out; //Настраиваем pin D10 на выход
D9_Out;
D4_In;
D5_In;
D6_In;
D2_In;
D2_High;
D4_High;
D5_High;
D6_High;
//pinMode(2, INPUT_PULLUP);
attachInterrupt(0, Kick,RISING );
}
void loop()
{
label:
p3=D4_Read;
p2=D5_Read;
p1=D6_Read;
if (p1==LOW && p2==HIGH && p3==HIGH) {mode++;
if (mode>9)
{
mode=1;
}
switch (mode) {
case 1:
Serial.println("mode: PWM Frequency HZ"); // Частота основного сигнала
break;
case 2:
Serial.println("mode: PWM Duty %"); // Ширина оснеовного сигнала
break;
case 3:
Serial.println("mode: Shift TT impulse uS"); // сдвиг второго импульча относительно первого
break;
case 4:
Serial.println("mode: Duty TT impulse uS"); // ширина второго импульса
break;
case 5:
Serial.println("mode: Impulses packet"); // пачкоген. количество импульсов
break;
case 6:
Serial.println("mode: Pause between impulses uS"); // пауза между импульсами в пакете
break;
case 7:
Serial.println("mode: Second cycle ON/OFF"); // включение импульса во втором полупериоде
break;
case 8:
Serial.println("mode: Save Data"); // включение импульса во втором полупериоде
break;
case 9:
Serial.println("mode: Load Data"); // включение импульса во втором полупериоде
break;
// default:
}
delay_ms(300);
}
if (p3==LOW && p2==HIGH && p1==HIGH)
{
switch (mode){
case 1:
f++;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
break;
case 2:
duty++;
if (duty>255) duty=255;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(duty);
break;
case 3:
shift++;
Serial.println(shift);
break;
case 4:
if (dutyTT==0){
detachInterrupt(0);
attachInterrupt(0, Kick,RISING );
}
dutyTT++;
Serial.println(dutyTT);
break;
case 5:
packet++;
Serial.println(packet);
break;
case 6:
packet_del++;
Serial.println(packet_del);
break;
case 7:
cycle=1;
attachInterrupt(1, KickInv,FALLING );
Serial.println("Second cycle ON!");
break;
case 8:
WriteEEPROM_Long(0, f);
WriteEEPROM_Byte(10, duty);
WriteEEPROM_Long(15, shift);
WriteEEPROM_Long(25, dutyTT);
WriteEEPROM_Byte(35, packet);
WriteEEPROM_Byte(36, packet_del);
WriteEEPROM_Byte(37, cycle);
Serial.println("Data saved!");
break;
case 9:
f = ReadEEPROM_Long(0);
duty = ReadEEPROM_Byte(10);
shift = ReadEEPROM_Long(15);
dutyTT = ReadEEPROM_Long(25);
packet = ReadEEPROM_Byte(35);
packet_del = ReadEEPROM_Byte(36);
cycle = ReadEEPROM_Byte(37);
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
if (cycle==1) attachInterrupt(1, KickInv,FALLING );
else detachInterrupt(1);
Serial.println("Data loaded!");
break;
}
delay_ms(100);
}
if (p2==LOW && p1==HIGH && p3==HIGH)
{
switch (mode){
case 1:
f--;
if (f<50)f=50;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
break;
case 2:
duty--;
if (duty<0) duty=0;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(duty);
break;
case 3:
shift--;
if (shift<=0)shift=1;
Serial.println(shift);
break;
case 4:
dutyTT--;
if(dutyTT<=0){dutyTT=0;
detachInterrupt(0);
attachInterrupt(0, Kick1,RISING );
Serial.println(dutyTT);
}
break;
case 5:
packet--;
if (packet<1)packet=1;
Serial.println(packet);
break;
case 6:
packet_del--;
if (packet_del<0)packet_del=0;
Serial.println(packet_del);
break;
case 7:
cycle=0;
detachInterrupt(1);
Serial.println("Second cycle OFF!");
break;
case 8:
WriteEEPROM_Long(0, f);
WriteEEPROM_Byte(10, duty);
WriteEEPROM_Long(15, shift);
WriteEEPROM_Long(25, dutyTT);
WriteEEPROM_Byte(35, packet);
WriteEEPROM_Byte(36, packet_del);
WriteEEPROM_Byte(37, cycle);
Serial.println("Data saved!");
break;
case 9:
f = ReadEEPROM_Long(0);
duty = ReadEEPROM_Byte(10);
shift = ReadEEPROM_Long(15);
dutyTT = ReadEEPROM_Long(25);
packet = ReadEEPROM_Byte(35);
packet_del = ReadEEPROM_Byte(36);
cycle = ReadEEPROM_Byte(37);
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
if (cycle==1) attachInterrupt(1, KickInv,FALLING );
else detachInterrupt(1);
Serial.println("Data loaded!");
break;
}
delay_ms(100);
}
if (p3==LOW && p2==HIGH && p1==LOW && mode==1)
{
f=f+100;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
delay_ms(100);
}
if (p2==LOW && p1==HIGH && p3==LOW && mode==1)
{
f=f-100;
if (f<50)f=50;
success = SetPinFrequencySafe(pwm, f);
pwmWrite(pwm, duty);
Serial.println(f);
delay_ms(100);
}
//analogWrite(9,30);
goto label;
}
void Kick()
{ pac=0;
delay_us(shift);
while(pac<packet)
{
D10_High;
delay_us(dutyTT);
D10_Low;
if(packet_del>0)delay_us(packet_del);
pac++;
}
}
void Kick1()
{ pac=0;
delay_us(shift);
while(pac<packet)
{
D10_High;
D10_Low;
pac++;
}
}
void KickInv()
{ pac=0;
delay_us(shift);
while(pac<packet)
{
D10_High;
delay_us(dutyTT);
D10_Low;
if(packet_del>0)delay_us(packet_del);
pac++;
}
}
Есть желание? помоги дороботать! Частота от 1,0 до 2,0 МГЦ не реализована. Нужно подключать модуль AD9850
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Данные выводить на PC нельзя, а надо на дисплей, т.к. все это хозяйство помещать в экран.Abadiya пишет: Есть желание? помоги дороботать! Частота от 1,0 до 2,0 МГЦ не реализована. Нужно подключать модуль AD9850
Я сейчас не смогу проводить опыты с Ардуино, плата задействована на моей электростанции, прикупить еще смогу в Чайна только летом.
Делался генератор прямоугольник до 4,0МГц на Ардуино с дисплеем LED1600, регулировка энкодером.
Может поможет Вам , вот скетч:
подключен к пинам A1 и A2, кнопка энкодера подключена к A0.
Кнопка частота/скважность 2
Требуется использовать конденсаторы 0,01..0,1uf относительно земли
на каждый вывод энкодера. Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro)
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 4, 5, 6, 7, ;
#define set_duty() { OCR1A=(uint32_t)ICR1*duty/100; }
uint8_t duty=50;
float freq;
volatile uint8_t enc_mode_flag=1; // По умолчанию энкодер регулирует частоту
void setup() {
lcd.begin(16, 2);
pinMode (13,OUTPUT); // LED
pinMode (9,OUTPUT); // выход генератора PB2
pinMode(A0,INPUT); // PC0 кнопка энкодера
pinMode(A1,INPUT); // PC1 вывод энкодера
pinMode(A2,INPUT); // PC2 вывод энкодера
pinMode(2,INPUT_PULLUP); // подтяжка кнопки "режим энкодера"
PCICR=1<<PCIE1; //разрешить прерывание PCINT1
PCMSK1=1<<PCINT9;// По сигналу на А1 создавать прерывание
TCCR1A=1<<COM1A1; //подключить выход OC1A первого таймера
TCCR1B=0;//
EICRA=1<<ISC01; //int0 -falling mode
EIMSK=1; //int0 enable
}
ISR (INT0_vect){
if ((PIND & (1<<2)) == 0)
{ enc_mode_flag = !enc_mode_flag; }
}
ISR (PCINT1_vect){;
uint8_t n=PINC&6; //считать значение энкодера частоты
if (enc_mode_flag) enc_freq(n); // если энкодер в режиме частоты
if (!enc_mode_flag) enc_duty(n); // если энкодер в режиме скважности
}
void enc_freq(uint8_t n){
static boolean gen_mode=0; //флаг режима управления
static uint32_t enc=1; //переменная счёта энкодера
uint32_t icr=ICR1;
uint16_t divider=1; //переменная коэфф. деления прескалера
boolean knopka = PINC&(1<<0); // 0-кнопка нажата, 1-кнопка НЕ нажата.
if (freq<2848) gen_mode=0; //переключение режима управления по частоте
if (freq>=2848) gen_mode=1; //переключение режима управления по OCR
// Если увеличение частоты
if (n==4||n==2){
if (gen_mode){if (knopka){ if(icr>2) {icr--; } } else { if(icr>12)icr-=10; } }
else knopka? enc++ : enc+=100; // в нч режиме
} //end GetUP
// Если уменьшение частоты
if (n==6||n==0){
if (gen_mode){ if (knopka){ if(icr<65535) {icr++; } } else { if(icr<=65525)icr+=10; } }
else {if (knopka) { if (enc>=2)enc--; } else { if (enc>100) enc-=100; } }
} //end GetDown
if(gen_mode){ ICR1=icr; set_duty(); freq= (float)F_CPU/2 / ICR1; }
else { //расчёт прескалера и ICR по нужной частоте
divider=1; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=8; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=64; icr = F_CPU / enc /2 /divider;
if (icr >65536) {divider=256; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=1024; icr = F_CPU / enc /2 /divider;
if (icr >65536){icr=65536; }}}}} ICR1=icr-1; set_duty();
//запись в регистр прескалера
switch (divider) {
case 1: TCCR1B=1|(1<<WGM13); break;
case 8: TCCR1B=2|(1<<WGM13); break;
case 64: TCCR1B=3|(1<<WGM13); break;
case 256: TCCR1B=4|(1<<WGM13); break;
case 1024: TCCR1B=5|(1<<WGM13); break; }
freq= (float) F_CPU/2 / (ICR1+1) /divider;
} //конец "если не Gen_mode (частота менее 2848 герц)
} // конец enc_freq
void enc_duty(uint8_t n){
// Если увеличение скважности
if (n==4||n==2){if(duty<100) {duty++; } }
// Если уменьшение скважности
if (n==6||n==0){ if(duty>0) {duty--; }}
set_duty();
}
void loop() {
String freqstr, dutystr,modestr;
if (freq <10000) {
freqstr= String( String(freq,2)+ " Hz ");
}
if (freq >10000) {
freqstr= String( String((freq/1000),3)+ " KHz "); }
lcd.setCursor(0, 0);
lcd.print(freqstr);
dutystr= String("Duty="+ String(duty)+ " % ");
lcd.setCursor(0, 1);
lcd.print(dutystr);
enc_mode_flag? modestr=String("Freq") : modestr=String("Duty");
lcd.setCursor(12, 1);
lcd.print(modestr);
delay(100);// что-б слишком часто в дисплей не писало..
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Купи с доставкой. Точно раньше чем до лета придёт. Китайцы сами на велеке привезут ))Mining пишет:
Данные выводить на PC нельзя, а надо на дисплей, т.к. все это хозяйство помещать в экран.Abadiya пишет: Есть желание? помоги дороботать! Частота от 1,0 до 2,0 МГЦ не реализована. Нужно подключать модуль AD9850
Я сейчас не смогу проводить опыты с Ардуино, плата задействована на моей электростанции, прикупить еще смогу в Чайна только летом.
Делался генератор прямоугольник до 4,0МГц на Ардуино с дисплеем LED1600, регулировка энкодером.
Может поможет Вам , вот скетч:
ВНИМАНИЕ: Спойлер! [ Нажмите, чтобы развернуть ] [ Нажмите, чтобы скрыть ]/* Генератор 1 Hz..4 MHz. С регулировкой скважности. LED1600. Энкодер
подключен к пинам A1 и A2, кнопка энкодера подключена к A0.
Кнопка частота/скважность 2
Требуется использовать конденсаторы 0,01..0,1uf относительно земли
на каждый вывод энкодера. Скетч для ардуино на мк atmega328 (UNO,Nano, MiniPro)
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 4, 5, 6, 7, ;
#define set_duty() { OCR1A=(uint32_t)ICR1*duty/100; }
uint8_t duty=50;
float freq;
volatile uint8_t enc_mode_flag=1; // По умолчанию энкодер регулирует частоту
void setup() {
lcd.begin(16, 2);
pinMode (13,OUTPUT); // LED
pinMode (9,OUTPUT); // выход генератора PB2
pinMode(A0,INPUT); // PC0 кнопка энкодера
pinMode(A1,INPUT); // PC1 вывод энкодера
pinMode(A2,INPUT); // PC2 вывод энкодера
pinMode(2,INPUT_PULLUP); // подтяжка кнопки "режим энкодера"
PCICR=1<<PCIE1; //разрешить прерывание PCINT1
PCMSK1=1<<PCINT9;// По сигналу на А1 создавать прерывание
TCCR1A=1<<COM1A1; //подключить выход OC1A первого таймера
TCCR1B=0;//
EICRA=1<<ISC01; //int0 -falling mode
EIMSK=1; //int0 enable
}
ISR (INT0_vect){
if ((PIND & (1<<2)) == 0)
{ enc_mode_flag = !enc_mode_flag; }
}
ISR (PCINT1_vect){;
uint8_t n=PINC&6; //считать значение энкодера частоты
if (enc_mode_flag) enc_freq(n); // если энкодер в режиме частоты
if (!enc_mode_flag) enc_duty(n); // если энкодер в режиме скважности
}
void enc_freq(uint8_t n){
static boolean gen_mode=0; //флаг режима управления
static uint32_t enc=1; //переменная счёта энкодера
uint32_t icr=ICR1;
uint16_t divider=1; //переменная коэфф. деления прескалера
boolean knopka = PINC&(1<<0); // 0-кнопка нажата, 1-кнопка НЕ нажата.
if (freq<2848) gen_mode=0; //переключение режима управления по частоте
if (freq>=2848) gen_mode=1; //переключение режима управления по OCR
// Если увеличение частоты
if (n==4||n==2){
if (gen_mode){if (knopka){ if(icr>2) {icr--; } } else { if(icr>12)icr-=10; } }
else knopka? enc++ : enc+=100; // в нч режиме
} //end GetUP
// Если уменьшение частоты
if (n==6||n==0){
if (gen_mode){ if (knopka){ if(icr<65535) {icr++; } } else { if(icr<=65525)icr+=10; } }
else {if (knopka) { if (enc>=2)enc--; } else { if (enc>100) enc-=100; } }
} //end GetDown
if(gen_mode){ ICR1=icr; set_duty(); freq= (float)F_CPU/2 / ICR1; }
else { //расчёт прескалера и ICR по нужной частоте
divider=1; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=8; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=64; icr = F_CPU / enc /2 /divider;
if (icr >65536) {divider=256; icr = F_CPU / enc /2 /divider;
if (icr >65536) { divider=1024; icr = F_CPU / enc /2 /divider;
if (icr >65536){icr=65536; }}}}} ICR1=icr-1; set_duty();
//запись в регистр прескалера
switch (divider) {
case 1: TCCR1B=1|(1<<WGM13); break;
case 8: TCCR1B=2|(1<<WGM13); break;
case 64: TCCR1B=3|(1<<WGM13); break;
case 256: TCCR1B=4|(1<<WGM13); break;
case 1024: TCCR1B=5|(1<<WGM13); break; }
freq= (float) F_CPU/2 / (ICR1+1) /divider;
} //конец "если не Gen_mode (частота менее 2848 герц)
} // конец enc_freq
void enc_duty(uint8_t n){
// Если увеличение скважности
if (n==4||n==2){if(duty<100) {duty++; } }
// Если уменьшение скважности
if (n==6||n==0){ if(duty>0) {duty--; }}
set_duty();
}
void loop() {
String freqstr, dutystr,modestr;
if (freq <10000) {
freqstr= String( String(freq,2)+ " Hz ");
}
if (freq >10000) {
freqstr= String( String((freq/1000),3)+ " KHz "); }
lcd.setCursor(0, 0);
lcd.print(freqstr);
dutystr= String("Duty="+ String(duty)+ " % ");
lcd.setCursor(0, 1);
lcd.print(dutystr);
enc_mode_flag? modestr=String("Freq") : modestr=String("Duty");
lcd.setCursor(12, 1);
lcd.print(modestr);
delay(100);// что-б слишком часто в дисплей не писало..
}
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
Да и есть повод прокатиться по приличным дорогам и посмотреть на цивилизованный город в Чайна.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.