Страница 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 писал(а):ШИМ аппаратный не подходит, так как он жёстко привязан к портам МК.
Спойлер
Код: Выделить всё
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.

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КГц...

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 модулем.