Страница 1 из 2
Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 19:59:06
Sel4
Ребят, помогите с кодом.. Много чего пролистал.. Везде только и есть регуляторы кнопочные. Вероятно, с потенциометром это очень просто, что никто не заморачивается.. Нужно регулировать скважность переменным резистором.
Резистор на входе ацп. Частотой, желательно, килогерц 10 -15. Контроллер для того, что на скважность влияют несколько таких резистров/датчиков.
Код: Выделить всё
#include<avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
//инициализация портов
PORTB = 0;
DDRB = 0x01;
//инициализация таймера Т0
TIMSK = 0;
//реж. - fast pwm, вывод OC0 - неинверт. шим, clk/64
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
TCNT0 = 0;
OCR0 = 0;
//инициализируем АЦП
//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
//вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//режим непрерывного преобразования
SFIOR = 0;
sei(); // __enable_interrupt(); - B AVRStudio 4.19 такое не компилица.
while(1);
return 0;
}
//********************************
//прерывание АЦП
ISR(ADC_vect) //#pragma vector=ADC_vect __interrupt void adc_my(void) - и это тоже.
{
//считываем старший регистр АЦП и
//записываем в регистр сравнения
OCR0 = ADCH;
}
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 20:03:13
Аlex
Ребят, помогите с кодом..
Вы же код привели. В чём проблема ?
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 20:38:49
Engineer_Keen
Sel4 писал(а):
Код: Выделить всё
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
ADPS="111" - срабатывание по захвату в таймере1, а он тут вообще не задействован. Непрерывное преобразование это "000"
упс... с ADTS перепутал...

Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 22:25:23
Sel4
Привести-то привел код, да ток никак он не работает... как-то трудно для понимания все эти ...ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADI.....
Пока не ясно, куда цеплять аналоговый вход - на ADC0 что ли?
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 22:36:52
Аlex
Документацию читать нужно, а не тыкать пальцем в небо.
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 22:54:45
Sel4
Для чего форум???
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 23:09:05
Аlex
Ну явно не для того, что-бы переписывать то, что уже написано кем то.
Ответный вопрос - А для чего даташиты ?
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Сб дек 15, 2012 23:30:48
Sel4
Помогли бы лучше с кодом разобраться...
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 00:01:42
yaotzin
Sel4 писал(а):Помогли бы лучше с кодом разобраться...
слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 00:38:45
Viver
Sel4 писал(а):Помогли бы лучше с кодом разобраться...
Здравствуйте!
Что-то у меня тоже автоматически преобразование запустится не захотело...
Но если прописать запуск вручную и назначить правильный порт на выход, то в протеусе работает...
Кстати, если для чего-то в железе, то (ИМХО) нуна добавить какое-нить
усреднениеинтегрирование...
Код: Выделить всё
#include<avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
//инициализация портов
PORTB = 0;
DDRB = 0x08; //<----------
//инициализация таймера Т0
TIMSK = 0;
//реж. - fast pwm, вывод OC0 - неинверт. шим, clk/64
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
TCNT0 = 0;
OCR0 = 0;
//инициализируем АЦП
//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
//вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//режим непрерывного преобразования
SFIOR &= 0x1F;
sei();
while(1);
}
ISR(ADC_vect)
{
//считываем старший регистр АЦП и
//записываем в регистр сравнения
OCR0 = ADCH;
ADCSRA |= _BV(ADSC); // запустить преобразование
}
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 00:40:58
yaotzin
подумав немного, хм.... в реале оно не так работать будит

поскольку входное напряжение будит изменятся все время на делителе прыгая, то и OCR все время будит прыгать то +1 то -1=))
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 00:46:00
Viver
yaotzin писал(а):подумав немного, хм.... в реале оно не так работать будит

поскольку входное напряжение будит изменятся все время на делителе прыгая, то и OCR все время будит прыгать то +1 то -1=))
Чуток опоздал с корректировкой своего поста

Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 01:45:46
Sel4
Ой, дорогие, спасибо, !! Я ж после Ардуиновского шима медленного пытаюсь въехать в С ..Трудновато, не 16 лет...
В протеусе работает , ща прошьюсь...
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 02:00:51
Sel4
Вот же странно...В протеусе 10кгц показывает, а в реале как 50 гц тарахтит на нагрузке чрез мосфет.. Осциллографа нет...
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 02:26:04
Sel4
yaotzin писал(а):
слеплено за 10 минут используя 2 примера с книжки Программирование микроконтроллеров ATMEL на языке С
К сожалению, как-то не так показывает в протеусе - какой-то не полный ШИМ, не в ноль и практически не регулируется. И частота 10 герц в реале,

Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 04:30:04
Sel4
Было:
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);
Переставил вот так:
TCCR0 = (1<<WGM21)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00)|(1<<CS00)|(1<<CS00);
Так как было, было как 50Гц, сейчас свист около 3Кгц, хотя в протеусе на осциллографе 17 us.
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 11:35:22
yaotzin
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 14:46:57
Viver
Sel4 писал(а):Вот же странно...В протеусе 10кгц показывает, а в реале как 50 гц тарахтит на нагрузке чрез мосфет.. Осциллографа нет...
Возможно, что Вы считаете для кварца, а фьюзы на "железе" соответственно не шьете....
Тот же код с просчитанными частотами ШИМа для тактового сигнала 1 МГц:
Спойлер
Код: Выделить всё
#include<avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
//инициализация портов
PORTB = 0;
DDRB = 0x08;
//инициализация таймера Т0
//реж. - fast pwm, вывод OC0 - неинверт. шим,
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|
// Для 1МГц:
// CS02CS01CS00 Предделитель Тактовая таймера, кГц Частота ШИМа, Гц
// 101 1024 0,977 3,83
// 100 256 3,906 15,31
// 011 64 15,625 61,25
// 010 8 125,000 490,19
// 001 1 1000,000 3921,56
(0<<CS02)|(1<<CS01)|(1<<CS00); //clk/64
TIMSK = 0x00;
TCNT0 = 0;
OCR0 = 0;
//инициализируем АЦП
//ион - напряжение питания, выравнивание влево, нулевой канал
ADMUX = (0<<REFS1)|(1<<REFS0)|(1<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);
//вкл. ацп, реж. непрерывн. преобр., разр. прерывания, частота преобр. = FCPU/128
ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//режим непрерывного преобразования
SFIOR &= 0x1F;
sei(); // __enable_interrupt(); - B AVRStudio 4.19 такое не компилица.
for(;;);
}
ISR(ADC_vect)
{
//считываем старший регистр АЦП и
//записываем в регистр сравнения
OCR0 = ADCH;
ADCSRA |= _BV(ADSC); // запустить преобразование
}
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 16:49:27
Sel4
Раз Atmega16 имеет встроенный генератор 16МГц, то не лучше ли на нем задействовать?
Если один раз прошить фьюзы на 16МГц, то так и останется при дальнейших прошивках?
Re: Помогите, Atmega16 ШИМ+потенциометр..
Добавлено: Вс дек 16, 2012 17:37:57
zero648
Sel4 писал(а):TCCR0 = (1<<WGM21)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00)|(1<<CS00)|(1<<CS00);
Это эквивалентно:
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(0<<CS01)|(1<<CS00);
В меге16 нет генератора на 16МГц максимум 8, это максимальный разгон 16МГц.