Страница 1 из 5

Генератор с длительностью импульсов 20us с частотой 80Khz

Добавлено: Вт фев 09, 2021 17:49:36
Chip_step
Привет всем. Вот пытаюсь сделать генератор импульсов 20us и с частотой 80Khz.
вот не могу понять как реализовать линейную регулировку частоты 80hz - 80Khz.
Мой код:

Код: Выделить всё

#include <mega32a.h>

//#define PORT_PWM PORTA.0
//#define BIT_pwm 0

volatile unsigned char t_pwm=5;  
static unsigned char count=0;

// Timer1 overflow interrupt service routine
 interrupt [TIM1_OVF] void timer1_ovf_isr(void)
 {
  TCNT1H=0xFF60 >> 8;
  TCNT1L=0xFF60 & 0xff;

  count++;
  if(count>=t_pwm){
  PORTA.0=1;
  #asm("nop")
   #asm("nop")
    #asm("nop")
     #asm("nop")
      #asm("nop")
       #asm("nop")
        #asm("nop")
         #asm("nop")
  PORTA.0=0;       
  count=0;
    // PORTA.0^=(1<<BIT_pwm);
  }
 } 
 
 

 
 
 
 
 
 
void main(void)
{

PORTA=0x00;
DDRA=0xff;



// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,01 ms
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0xFF;
TCNT1L=0x60;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);



#asm("sei")


while (1)
      {

      }
}

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Вт фев 09, 2021 19:47:05
Alex-lab
На частоте 80кГц период 12.5мкс. Как вы хотите 20 получить?

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Вт фев 09, 2021 20:22:27
Dimon456
Clock value: 16000,000 kHz, без переключения делителя можно перекрыть диапазон от ~250Гц до 50кГц(20us).
Ниже 250Гц потребуется делитель переключать.
Ну а примерный код выглядит так
Спойлер

Код: Выделить всё

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Disconnected
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1=0x00;

ICR1 = 0x140; // от 0x140 до 0xFFFF

OCR1A = 0x13F; // 20us

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Вт фев 09, 2021 21:37:21
Chip_step
По длительности импульса, не критично в меньшую сторону до 10uS.
ШИМ аппаратный не подходит, так как он жёстко привязан к портам МК.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 01:50:38
parovoZZ
В Attiny841 ни что ни к чему не привязано.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 02:24:01
Аlex
Chip_step писал(а):линейную регулировку частоты 80hz - 80Khz
80 Khz = 12.5 us период.
79 Khz= 12,65822784810127 us период.
Я уже не говорю о периоде на частоте 79999 hz, и разницы его с 80Khz.

Вопрос. Вы адекватно себе представляете задачу ?
Chip_step писал(а):ШИМ аппаратный не подходит
Уверены, что он бы Вас спас ?

PS: И причём тут вообще 20 us ? С какой стороны и к чему их приклеить ?

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 08:57:59
Dimon456
Chip_step писал(а):ШИМ аппаратный не подходит, так как он жёстко привязан к портам МК.
:dont_know:
Спойлер

Код: Выделить всё

ISR(TIMER1_COMPA_vect)
{
	PORTD &= ~(1<<0);
}

ISR(TIMER1_COMPB_vect)
{
	PORTD |= (1<<0);
}


// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,0625 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: On
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);

ICR1 = 0x140; // от 0x140 до 0xFFFF

OCR1A = 0x13F; // 20us	

OCR1B = 0;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (1<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

sei();
OCR1A = ((20 * 16)-1) или сколько вам там нужна длительность импульса.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 09:50:06
BOB51
"Линейной" регулировки на простом делителе/ШИМ в указанном диапазоне (80Гц-80КГц) не получить - будет с повышением частоты изменяться шаг перестройки. Чем выше частота, тем грубее перестройка.
Если шаг перестройки в 20-50Гц на диапазоне за 10Кгц и выше устраивает - можно на основе Т1 "быстрый ШИМ" попытаться соорудить (и то если речь идет о разумной длительности импульса).
Альтернатива только DDS.
8)

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 10:33:07
Reflector
[uquote="BOB51",url="/forum/viewtopic.php?p=3977847#p3977847"]"Линейной" регулировки на простом делителе/ШИМ в указанном диапазоне (80Гц-80КГц) не получить - будет с повышением частоты изменяться шаг перестройки. Чем выше частота, тем грубее перестройка.[/uquote]
Чем грубее перестройка, тем выше погрешность, в том числе линейной перестройки. Ничего же не мешает менять частоты с шагом, допустим, ~100 Гц.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 10:49:05
Dimon456
За чем такие сложности, DDS, ~100 Гц? Есть же NE555.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 12:01:19
BOB51
"хотелка" топикстартера - 80Гц-80КГц...
:dont_know:

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 14:52:41
Dimon456
Reflector писал(а):Чем грубее перестройка, тем выше погрешность, в том числе линейной перестройки.
Не такая уж это и существенная ошибка
СпойлерИзображение
Шаг перестройки частоты 200Гц
Ошибка указана в Герцах
тем более это не специализированный инструментальный чип.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Ср фев 10, 2021 22:06:06
Sergi
Можно попробовать по принципу PLL. Например управляемый генератор на 555 с делителем на 16 и в цепи обратной связи МК для расчета регулировок. Наверное можно получить шаг менее 10 Гц во всем диапазоне. 80000,79990,79980....

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Чт фев 11, 2021 16:51:23
Jack_A
И какая же будет точность/стабильность на 555? Тут шаг перестройки 10Гц на 80кГц покажется не очень удачной шуткой.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Чт фев 11, 2021 18:41:49
Sergi
Я написал про принцип ФАПЧ и ГУН. Выходная частота вычисляется как умноженная на К(целое) опорная частота. В данном случае 10Гц. Как это реализовать есть много способов,например ЦФАПЧ. На чем - желание и право выбора ТС.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Пт фев 12, 2021 06:20:42
Sergi
В простом случае нужно три таймера. Т0- с внешним входом, на него подаём сигнал с гун.
Т1- опорный ,делит внутреннюю частоту до 10 гц,по нему срабатывает прерывание.
Т3- для цап, вместе с rc фильтром формирует напряжение управления гун.
Гун с необходимой перестройкой по частоте, возможно многодиапазонный.
В прерывании от т1 вычисляется разница между т0 и заданной частотой. Это сигнал ошибки для ПИ регулятора.регулятор выдаёт управляющий код в т3 и далее на гун.
Схему гун на 555 смотреть в гугл.

Добавлено after 51 minute 9 seconds:
Re: Генератор с длительностью импульсов 20us с частотой 80Khz
Если в МК есть ещё один таймер с внешним входом можно упростить гун. Сделать с перекрытием в 3, 70-200 кгц и далее на дополнительный таймер с делением на 2-500 и с выхода брать нужную частоту. И все это почти не грузит ядро, только прерывание 10 раз в секунду. Для полного функционирования нужно 6(8) ног МК. 2- на spi дисплей, 2- на кнопки +/-,2- вход т0,выход т3 и если по богатому, 2- вход/выход дополнительного таймера.
В зависимости от гун и таймеров можно повысить точность установки до 1 гц.

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Пт фев 12, 2021 07:34:30
Ivanoff-iv
есть тиньки с PLL на 64МГц для таймера.... может на такой будет проще собрать?

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Пт фев 12, 2021 08:27:52
Sergi
А еще есть 74hc4046

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Пт фев 12, 2021 17:11:49
Zhuk72
Это обязательно должно быть на АВР сделано?

Re: Генератор с длительностью импульсов 20us с частотой 80Kh

Добавлено: Пт фев 12, 2021 18:07:55
КРАМ
[uquote="BOB51",url="/forum/viewtopic.php?p=3977847#p3977847"]Альтернатива только DDS.[/uquote]
Это не альтернатива. Это БЕЗальтернатива. :)))
Нужно взять МК с NCO модулем.