Генератор ШИМ сигнала c точной частотой и регулируемой скважностью.

Fenix_spb

✩✩✩✩✩✩✩
20 Окт 2022
14
0
Задача следующая на ATMEGA 328P реализовать регулируемый по частоте в диапазоне 22-28кГц ШИМ сигнал на котором можно будет регулировать скважность.
реализовал минимальный вариант в таком виде:
C:
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BOTTOM  411
#define TOP  0x3FF

ISR(TIMER1_OVF_vect)
{
    TCNT1=BOTTOM;
}
void Timer1_init()
{
    TCCR1A|=(1<<COM1A1)|(1<<WGM11)|(1<<WGM10);
    TCCR1B|=(1<<WGM12)|(1<<CS10);
    OCR1A=BOTTOM+1;
    TIMSK1|=(1<<TOIE0);
    asm("sei");
   
}
int main(void)
{
    DDRB|=(1<<PORTB1);
    Timer1_init();
    while (1)
    {
        if(OCR1A==TOP)
        {
            OCR1A=BOTTOM;
        }
        else
        {
            OCR1A++;
        }
        _delay_ms(100);
    }
}
Но такой вариант не очень устраивает, так как при изменении переменной BOTTOM на 1 единицу частота меняется примерно на 30-50Гц.
Есть ли вариант решить эту задачу хотя бы в диапазоне частот 25000Гц - 25999Гц, но с точностью задания частоты 1 Гц?
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,974
633
45
Определитесь еще с точностью скважности. А то вдруг вам нужна точность в доли процентов.
 

rkit

★★★✩✩✩✩
5 Фев 2021
508
127
Есть ли вариант решить эту задачу хотя бы в диапазоне частот 25000Гц - 25999Гц, но с точностью задания частоты 1 Гц?
Конечно есть. Нужен проц с частотой ~700МГц и 32хбитным таймером.
Элементарно считается ведь
20МГц/25кГц = переполнение таймера на 800; 20МГц/26кГц = ~769
Итого ~30 отсчетов на требуемый интервал, а тебе надо тысячу.
Получается 1000/30*20МГц=666Мгц.
Это еще хорошо, что передаточная функция почти идеально линейная в этом диапазоне, иначе бы тысячей отсчетов не обошлось.

1668310810269.png
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
Синтезатор частоты
Применить надобно.
Не иначе как AD9388.
Частота "неудобная". Программно МК не осилит,а аппаратно...хз. Если только на ассемблере.
Либо применить генератор,управляемый напряжением. Например, AD7740. Управлять 2R-R ЦАПом. Разрешение хоть 16 бит. Но это резко усложняет конструкцию.
 
Изменено:

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@bort707,
ну я навскидку прикинул что частоту 25-26 кгц можно регулировать некоторыми быстрыми манипуляциями в прерываниях. Скважность на ассемблере программно. Это реально. Беда в том что МК будет занят почти на все 100%.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
Да,действительно,погорячился я)
Ну тогда.....настроить один таймер на 25-26 кГц в режиме СТС с установкой нужного вывода "1". Вместе с оным событием в прерывании запускаем второй таймер, 8ми битный,,в роли одновибратора,предварительно настроив его,по возможности,чтоб его полный цикл соответствовал периоду первого таймера.
И вишенка на торт: частоту меняем перестройкой внешнего тактового генератора)))))
 

poty

★★★★★★✩
19 Фев 2020
3,237
942
Формально можно наплевать на прерывания и сделать паттерны из nop и функций изменения состояния порта, но... это как ноутбуком гвозди забивать.
 
  • Лойс +1
Реакции: te238s