Помогите с ШИМ на 100КГц
-
Serge_6989
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн окт 05, 2009 11:12:16
Помогите с ШИМ на 100КГц
Доброго времени суток! Стоит задача задавать управляющее напряжение для ГУН'а посредством ШИМ и интегрирующей RC-цепочки. В железе все давно собрано, сейчас дошел до программной реализации ШИМ и столкнулся с проблемой. Чтобы после RC-цепочки (10КОм, 10мкФ) не было пульсаций требуется частота выше 100КГц (если верить Proteus то идеално под 200КГц), а это у меня не получается. Аппаратно можно сделать только ~37КГц. Пробывал реализовать программно с большей частотой, но не получилось.
Может кто знает как можно решить эту проблему?
Заранее благодарен.
Может кто знает как можно решить эту проблему?
Заранее благодарен.
- Реклама
- mattheus
- Встал на лапы
- Сообщения: 85
- Зарегистрирован: Ср май 05, 2010 16:39:11
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
А можно подробнее, что не получалось. На таких частотах (100-200 кГц) вполне можно сделать программный ШИМ, вопрос только в его "разрешении" (т.е. дискретизации).Serge_6989 писал(а):Пробывал реализовать программно с большей частотой, но не получилось.
Код: Выделить всё
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{ // Reinitialize Timer 0 value
TCNT0=0xb0; // 1 MHz
// Place your code here
static int c;
c++; c&=0x07;
PORTB.0=(c&0x04>>2);
}
Конструкцию внутри функции void timer0_ovf_isr(void) стоит оптимизировать (всетаки этот код будет выполняться миллион раз в секунду), но на вид там меньше 8 тактов, так что работать должно. Нужно еще отключить сохранение переменных в стеке при вызове прерывания (для экономии времени). Тогда должно работать.
Подумал... А зачем вам прерывания? Если прерывания не нужны - то просто в главном цикле изменяем счетчик и "дергаем ножкой". В каждом цикле делаем задержку нужно длины (например, чтобы при дискретизации 8 один цикл занимал все те же 8 тактов при частоте кварца 8 МГц). Только для "точной" частоты нужно будет четко число команд за цикл посчитать (на задержку) (или ассемблере написать как вариант), а если "точная" частота не нужна - то и того проще...
Re: Помогите с ШИМ на 100КГц
http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
Почитайте про ШИМ
Вот: калькулятор для АВРок поможет с инициализацией таймеров.
Почитайте про ШИМ
Вот: калькулятор для АВРок поможет с инициализацией таймеров.
-
Serge_6989
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн окт 05, 2009 11:12:16
Re: Помогите с ШИМ на 100КГц
Я это читал, там ведь разбирается аппаратный ШИМ. Однако перечитав нашел интересную идею, которую завтра попробую.phenomen писал(а):http://easyelectronics.ru/avr-uchebnyj- ... -shim.html
Почитайте про ШИМ
Вот: калькулятор для АВРок поможет с инициализацией таймеров.
В этом то и проблема. Мне нужно 8-битный ШИМ (256 отчетов на период).mattheus писал(а):..., вопрос только в его "разрешении" (т.е. дискретизации).
Если можно это место подробней. В CodeVision AVR я не нашел такой опции. Можно только задать размер стека.Нужно еще отключить сохранение переменных в стеке при вызове прерывания (для экономии времени).
Re: Помогите с ШИМ на 100КГц
256 * 100 кГц = 25,6 МГц.Serge_6989 писал(а):Мне нужно 8-битный ШИМ (256 отчетов на период).
Вам подойдет аппаратный ШИМ на high speed таймере - например tiny26 умеет такое с некоторыми ограничениями/оговорками.
ЗЫ: еще на вскидку: tiny45
— Не говорите мне что делать и я не скажу куда Вам идти...
- Реклама
- mattheus
- Встал на лапы
- Сообщения: 85
- Зарегистрирован: Ср май 05, 2010 16:39:11
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
Используется #pragma savereg-. Во встроенном Help CodeVisionAVR найдите раздел "The Preprocessor" и скрольтесь до #pragma.Serge_6989 писал(а):Если можно это место подробней. В CodeVision AVR я не нашел такой опции. Можно только задать размер стека.Нужно еще отключить сохранение переменных в стеке при вызове прерывания (для экономии времени).
Код: Выделить всё
The automatic saving and restoring of registers affected by the interrupt handler, can be turned on or off using the #pragma savereg directive.
Example:
/* Turn registers saving off */
#pragma savereg-
/* interrupt handler */
interrupt [1] void my_irq(void) {
/* now save only the registers that are
affected by the routines in the interrupt
handler, for example R30, R31 and SREG */
#asm
push r30
push r31
in r30,SREG
push r30
#endasm
/* place the C code here */
/* now restore SREG, R31 and R30 */
#asm
pop r30
out SREG,r30
pop r31
pop r30
#endasm
}
/* re-enable register saving for the other interrupts */
#pragma savereg+
The default state is automatic saving of registers during interrupts.
The #pragma savereg directive is maintained only for compatibility with versions of the compiler prior to V1.24.1. This directive is not recommended for new projects.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
не понятно две вещи - какой камень и какова тактовая частота
например мега 8 на 16 мегагерцах и 256 дискретизацией может выдать максимум 16000000/256 = 62500 герц....
но если уменьшить битность до 7 то уже можно 125 килогерц....
нужно 100 вилогерц - 160 вариаций....
запускаете таймер в фаст PWM top on ICP = 160
этот код даст Вам 100 000 герц на 160 отсчетов два выхода...задавать скважность значениями OCR1A и OCR1B 0 это ноль 160 это 100%
например мега 8 на 16 мегагерцах и 256 дискретизацией может выдать максимум 16000000/256 = 62500 герц....
но если уменьшить битность до 7 то уже можно 125 килогерц....
нужно 100 вилогерц - 160 вариаций....
запускаете таймер в фаст PWM top on ICP = 160
Код: Выделить всё
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA2;
TCCR1B=0x19;
TCNT1=0x00;
ICR1=160;
OCR1A=0x00;
OCR1B=0x00;
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
Была похожая проблема: http://leoniv.livejournal.com/87824.html
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
ндям...тема таки очень похожа... FPGA ... алгоритмы брезенхема...атенюаторы....
ну хотя конечно да....нужно на самом деле не RC цепочка а нормальный LoPass фильтр на операционниках...и тогда частоту можно хоть 1 килогерц...но...я бы лично увеличил резистор до 100 килоом а выход с кандера просто "повторил" бы операционником...
ну хотя конечно да....нужно на самом деле не RC цепочка а нормальный LoPass фильтр на операционниках...и тогда частоту можно хоть 1 килогерц...но...я бы лично увеличил резистор до 100 килоом а выход с кандера просто "повторил" бы операционником...
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.
-
Serge_6989
- Первый раз сказал Мяу!
- Сообщения: 31
- Зарегистрирован: Пн окт 05, 2009 11:12:16
Re: Помогите с ШИМ на 100КГц
Купил ATtiny85. у нее можно тактировать таймер частотой существенно большей чем тактовая частота ядра МК. Буду делать на ней. Жалко я раньше не знал про такую возможность некоторых МК tiny
.
-
clawham
- Поставщик валерьянки для Кота
- Сообщения: 1957
- Зарегистрирован: Пт окт 31, 2008 09:38:55
- Откуда: Одесса
- Контактная информация:
Re: Помогите с ШИМ на 100КГц
ну это да....250 килогерц при 256 градациях...
Код: Выделить всё
// Timer/Counter 1 initialization
// Clock source: 64MHz PCK
// Clock value: 64000,000 kHz
// Mode: PWMA & B top=OCR1C
// OC1A output: Non-Inv., /OC1A connected
// OC1B output: Non-Inv., /OC1B connected
// Timer1 Overflow Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Enable the PLL
PLLCSR=0x02;
// Wait for the PLL to lock
while ((PLLCSR & 1)==0);
// Enable the 64MHz clock
PLLCSR|=0x04;
TCCR1=0x51;
GTCCR=0x50;
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0xFF;
Что нас не убило сделало нас осторожней
Не доверяйте русским лужам - это может быть вход в метро.
Не доверяйте русским лужам - это может быть вход в метро.


