Изменение частоты ШИМ
- Войдите на сайт для отправки комментариев
В статье https://habr.com/ru/post/415333/
Цитирую - "Несложно написать скетч для формирования такого сигнала, но в этом нет необходимости: готовый сигнал нужной нам формы можно получить на выходе с широтно-импульсной модуляцией. При частоте ШИМ 62,5 кГц частота третьей гармоники равна 187.5 кГц, и она попадает в радиовещательный диапазон длинных волн. Достаточно подать на соответствующий выход Arduino сигнал низкой частоты и подключить к нему антенну, остальное сделает ШИМ. "
void setup() { // Параметры ШИМ TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09; } int const SHIFT = 8; int const SCALE = 8; void loop() { analogWrite(9, (analogRead(A0) - 512) / SCALE + SHIFT); }
Ворос - как сменить частоту ШИМ на 68 кГц или 136 кГц?
вот так!
Там читать надо. 9 страниц. И вникать... Что сложнее.
Неужто нельзя просто ответить на ворос?
Желательно с примерами.
Там читать надо. 9 страниц. И вникать... Что сложнее.
Неужто нельзя просто ответить на ворос?
Желательно с примерами.
Results for frequency: 68000.00Hz
Prescaler: 1; MaxValue: 117; Frequency: 67796.61Hz; Diff: 203.39Hz
Prescaler: 8; MaxValue: 14; Frequency: 66666.67Hz; Diff: 1333.34Hz
Prescaler: 64; MaxValue: 1; Frequency: 62500.00Hz; Diff: 5500.00Hz
Results for frequency: 136000.00Hz
Prescaler: 1; MaxValue: 58; Frequency: 135593.21Hz; Diff: 406.78Hz
Prescaler: 8; MaxValue: 6; Frequency: 142857.14Hz; Diff: 6857.14Hz
Prescaler: 64; MaxValue: 0; Frequency: 125000.00Hz; Diff: 11000.00Hz
Results for frequency: 136000.00Hz
Prescaler: 1; MaxValue: 58; Frequency: 135593.21Hz; Diff: 406.78Hz
Prescaler: 8; MaxValue: 6; Frequency: 142857.14Hz; Diff: 6857.14Hz
Prescaler: 64; MaxValue: 0; Frequency: 125000.00Hz; Diff: 11000.00Hz
01
enum
Prescalers {
02
PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
03
};
04
05
void
setup
() {
06
uint8_t prescaler = PRESCALER_1;
07
uint16_t topValue = 58;
08
pinMode(9, OUTPUT);
09
TCCR1A = 0x40;
// Инвертирование пина 9 по сравнению
10
TCCR1B = 0x08 | prescaler;
// Установить СТС режим и делитель частоты
11
OCR1A = topValue;
// установить TOP равным topValue
12
}
13
14
void
loop
() {}
А как посчитать на другую частоту???? Где формула или исходные данные?
uint16_t topValue = 58; какое максимальное число можно применить?
Results for frequency: 136000.00Hz
Prescaler: 1; MaxValue: 58; Frequency: 135593.21Hz; Diff: 406.78Hz
Prescaler: 8; MaxValue: 6; Frequency: 142857.14Hz; Diff: 6857.14Hz
Prescaler: 64; MaxValue: 0; Frequency: 125000.00Hz; Diff: 11000.00Hz
01
enum
Prescalers {
02
PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
03
};
04
05
void
setup
() {
06
uint8_t prescaler = PRESCALER_1;
07
uint16_t topValue = 58;
08
pinMode(9, OUTPUT);
09
TCCR1A = 0x40;
// Инвертирование пина 9 по сравнению
10
TCCR1B = 0x08 | prescaler;
// Установить СТС режим и делитель частоты
11
OCR1A = topValue;
// установить TOP равным topValue
12
}
13
14
void
loop
() {}
А как посчитать на другую частоту???? Где формула или исходные данные?
uint16_t topValue = 58; какое максимальное число можно применить?
Для тех, кто дочитает по ссылке до конца Евгений Петрович выложил скетч калькулятора, вводишь в мониторе порта требуемую частоту, он и рассчитает )))
Вы читать не умеете? Или какие у Вас проблемы?
"Терминальная" версия генератора. Запустить терминалку, послать требуемую частоту в герцах. В ответ напишется та частота, которую смог сделать МК.
кодрасечатать?
01
void setup() {
02
Serial.begin(9600);
03
pinMode (9,OUTPUT); // выход генератора
04
TCCR1A=0;TCCR1B=0;
05
}
06
void loop() {
07
static uint32_t reqfreq=0; //переменная запроса частоты
08
uint32_t ocr=OCR1A; uint16_t divider=1; float freq;
09
if (Serial.available() > 0){ reqfreq = Serial.parseInt();
10
if (reqfreq==0 || reqfreq>F_CPU/2) {return;}
11
ocr = (F_CPU / reqfreq /2 /divider);
12
byte shifts[] = {3,3,2,2};
13
for(byte i = 0; i < 4; i++){
14
if (ocr > 65536) { divider <<= shifts[i];
15
ocr = F_CPU / reqfreq /2 /divider; }
16
else { TCCR1B = (i+1)|(1< 17
OCR1A=ocr-1; TCCR1A=1< 18
freq= (float) F_CPU/2 / (OCR1A+1) /divider;
19
if (freq <10000) { Serial.print(freq,1);Serial.println(" Hz "); }
20
if (freq >=10000) { Serial.print(freq/1000,3);Serial.println(" kHz");}
21
}
22
}
Вообщем отсуда не ясно про максимальное число uint16_t topValue = 58;