Изменение частоты ШИМ

Гость

В статье 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 кГц?

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
Green
Offline
Зарегистрирован: 01.10.2015

Там читать надо. 9 страниц. И вникать... Что сложнее.
Неужто нельзя просто ответить на ворос?
Желательно с примерами.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Там читать надо. 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

enum Prescalers {
	PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
};

void setup() {
	uint8_t prescaler = PRESCALER_1;
	uint16_t topValue = 117;
	pinMode(9, OUTPUT);
	TCCR1A = 0x40;			// Инвертирование пина 9 по сравнению
	TCCR1B = 0x08 | prescaler;	// Установить СТС режим и делитель частоты
	OCR1A = topValue;		// установить TOP равным topValue
}

void loop() {}

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

enum Prescalers {
	PRESCALER_1 = 1, PRESCALER_8 = 2, PRESCALER_64 = 3, PRESCALER_256 = 4, PRESCALER_1024 = 5
};

void setup() {
	uint8_t prescaler = PRESCALER_1;
	uint16_t topValue = 58;
	pinMode(9, OUTPUT);
	TCCR1A = 0x40;			// Инвертирование пина 9 по сравнению
	TCCR1B = 0x08 | prescaler;	// Установить СТС режим и делитель частоты
	OCR1A = topValue;		// установить TOP равным topValue
}

void loop() {}

 

rk6jcv (не проверено)

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; какое максимальное число можно применить?

rk6jcv (не проверено)

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; какое максимальное число можно применить?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Для тех, кто дочитает по ссылке до конца Евгений Петрович выложил скетч калькулятора, вводишь в мониторе порта требуемую частоту, он и рассчитает )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rk6jcv пишет:
А как посчитать на другую частоту????
Ахренеть. Человеку дали ссылку, он не удосужился её прочитать и продолжает задавать вопросы. 

Вы читать не умеете? Или какие у Вас проблемы?

rk6jcv (не проверено)

"Терминальная" версия генератора. Запустить терминалку, послать требуемую частоту в герцах. В ответ напишется та частота, которую смог сделать МК.

кодрасечатать?
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;

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rk6jcv пишет:
Вообщем отсуда не ясно про максимальное число uint16_t topValue = 58;
);>

UINT16_MAX – вернёт 65 535