ШИМ atmega8

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Вроде пока разобрался с реализацией 1го канала ШИМ)

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int aSin[128]={
	127,134,140,146,152,158,164,170,176,182,187,193,198,203,208,213,217,222,226,230,233,
	236,240,242,245,247,249,251,252,253,254,254,254,254,254,253,252,251,249,247,245,242,
	240,236,233,230,226,222,217,213,208,203,198,193,187,182,176,170,164,158,152,146,140,
	134,127,121,115,109,103,97,91,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10,
	8,6,4,3,2,1,1,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,73,79,85,
	91,97,103,109,115,121
};
int i;

ISR(TIMER1_COMPA_vect)
{
	OCR2=aSin[i];
	i++;
	if (i>127) i=0;
}
int main(void)
{
	PORTB=0x00;
	DDRB = (1<<PB1) |(1<<PB2)| (1<<PB3);      
	TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
	OCR1A=512;
	TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
	TIMSK=(1<<OCIE1A);
	sei();
	for (;;)
	{
	}
	return 0;
}
Но сюда вроде можно еще подключить только OCR1B для 2ой фазы т.к OCR1A уже Используется (.

Я только вижу один выход перекинуть на Т0 регулировку частоты фаз. (TIMER0_OVF_vect). Или есть еще какие то решения ?
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

В меге 3 таймера генерируют ШИМ - 2 канала TIMER1 и 1 канал TIMER2. Вам для 3 фаз придется задействовать все три.
Модуляцию, очевидно, придется возложить на незадействованный TIMER0 - куда деваться-то?

Для оптимизации желательно было бы сделать таблицу синуса из 256 значений, тогда не надо было сравнивать и обнулять индекс... Но если удобнее 128, то, как мне кажется, оптимальнее сделать OCR1A = aSin[i & 0x7F];

Добавлено after 54 seconds:
Да, кстати, у вас нет volatile для глобальных переменных, используемых в прерывании - нарветесь на проблемы.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Это пока Тестовый весь код.

попытался сделать через Т0 прерывания по переполнению. Возник вопрос по поводу регулировки частоты, Есть ли еще какой нибудь способ регулировать частоту прерываний? , а то TIMER1_COMPA_vect с прерыванием без делителя и частотой кварца 8 Mhz уж очень широкими шагами регулирует частоту синуса (. и реально ли сделать шаг хотя бы 0.5 hz ?

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

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int aSin[128]={
	127,134,140,146,152,158,164,170,176,182,187,193,198,203,208,213,217,222,226,230,233,
	236,240,242,245,247,249,251,252,253,254,254,254,254,254,253,252,251,249,247,245,242,
	240,236,233,230,226,222,217,213,208,203,198,193,187,182,176,170,164,158,152,146,140,
	134,127,121,115,109,103,97,91,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10,
	8,6,4,3,2,1,1,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,73,79,85,
	91,97,103,109,115,121
};
int i;
/*
ISR(TIMER1_COMPA_vect)
{
	OCR2=aSin[i];
	i++;
	if (i>127) i=0;

}
*/
int t1;
ISR(TIMER0_OVF_vect)
{
	if (t1==21)
	{
	OCR2=aSin[i];
	i++;
	if (i>127) i=0;
	}
	t1++;
	if (t1>21)
	{
		t1=0;
	}
}

int main(void)
{
	PORTB=0x00;
	DDRB = (1<<PB1) |(1<<PB2)| (1<<PB3);      
	//TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
	//OCR1A=512;
	TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
	TIMSK=(0<<OCIE1A)|(1<<TOIE0);
	TCCR0=(1<<CS00);
	sei();
	for (;;)
	{
	}
	return 0;
}
andrei23061996@gmail.com
.................................................................................................................
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Можно

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

OCR1A=10*F_CPU/64/(1000-0)/2-1
//OCR1A=10*F_CPU/64/(1000-5)/2-1
TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
TIMSK=(1<<OCIE1A)|(1<<TOIE0);
TCCR0=(1<<CS00);
Попробуйте менять значение во второй строке, раскомментировав её.

09.08.2017
Можно проще. Для примера, изменение с шагом 0,1Гц в диапазоне 100...5Гц

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

OCR1A=10*F_CPU/128/(1000-n)-1   ; при изменении n в диапазоне 0...950, частота 
TCCR1B = (1<<WGM12)|(1<<CS10);
TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
TIMSK=(1<<OCIE1A)|(1<<TOIE0);
TCCR0=(1<<CS00);
Последний раз редактировалось akl Ср авг 09, 2017 04:25:48, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

О том, как получить плавное регулирование частоты модуляции хоть с шагом в 0,0001 Гц, следует курить DDS - прямой цифровой синтез.

Если очень-очень кратко о принципе, то он следующий.
Вы заводите переменную не в 8 бит для "скольжения по массиву синусов", а больше, например, 32 бита. Для того самого индексного просмотра таблицы синусов используете СТАРШИЕ биты этого счетчика. А инкрементируете этот счетчик по таймеру, причем частота инкремента постоянная, а шаг может меняться.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Походу все таки 8мега слабовата для Генерации трех фаз с регулировкой частоты 5-50 герц с шагом в 1 герц(

В итоге код пока что такой получился после РЦ цепочки синус получается со сдвигом 120 , но без нее это полный трешь там и речи походу о 120 градусов нет )

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

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

int aSin[128]={
	127,134,140,146,152,158,164,170,176,182,187,193,198,203,208,213,217,222,226,230,233,
	236,240,242,245,247,249,251,252,253,254,254,254,254,254,253,252,251,249,247,245,242,
	240,236,233,230,226,222,217,213,208,203,198,193,187,182,176,170,164,158,152,146,140,
	134,127,121,115,109,103,97,91,85,79,73,68,62,57,52,47,42,38,33,29,25,22,19,15,13,10,
	8,6,4,3,2,1,1,0,1,1,2,3,4,6,8,10,13,15,19,22,25,29,33,38,42,47,52,57,62,68,73,79,85,
	91,97,103,109,115,121
};
int i1=0; //Переменная для подсчета элемента массива
int i2=43; //Переменная для подсчета элемента массива
int i3=85; //Переменная для подсчета элемента массива
int t1=0; // переменная для изменения частоты синуса (скорость прохода по массиву aSin )
ISR(TIMER0_OVF_vect)
{
	t1++;
	if (t1==6)
	{
	//PORTB^=(1<<PB0); // Отладочный сигнал.
	OCR1A=aSin[i1];
	OCR1B=aSin[i2];
	OCR2=aSin[i3];
	i1++;
	i2++;
	i3++;
	if (i1>127) i1=0;
	if (i2>127) i2=0;
	if (i3>127) i3=0;
	}
	if (t1>6) t1=0;
}

int main(void)
{
	PORTB=0x00;
	DDRB = (1<<PB0) |(1<<PB1) |(1<<PB2)| (1<<PB3);
	TCCR0=(0<<CS02)|(0<<CS01)|(1<<CS00);
	TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(1<<WGM10);
	TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
	TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(0<<CS20);
	TIMSK=(0<<OCIE2)|(0<<TOIE2)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(1<<TOIE0);
	
	sei();
	for (;;)
	{
	}
	return 0;
}
Добавлено after 1 minute 40 seconds:
А кто нить побывал DDS на меге8 ,для работы 3х фаз ?

Добавлено after 19 minutes 32 seconds:
Или все таки купить мегу48 у нее как раз 5 каналов ШИМ есть как думаете ?

Добавлено after 15 minutes 49 seconds:
Уменьшив дискретность добился нужной регулировки частоты)
Но все равно что то мне не очень нравиться форма ШИМ , или IR2130 такую скушает ?

Добавлено after 53 seconds:
Изображение

Добавлено after 17 minutes 37 seconds:
А должен вроде быть похож на такой:
Изображение
Вложения
шим1.JPG
(45.21 КБ) 896 скачиваний
оцилограма.JPG
(83.7 КБ) 892 скачивания
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

7seg писал(а):Походу все таки 8мега слабовата для Генерации трех фаз с регулировкой частоты 5-50 герц с шагом в 1 герц
нет, не слабовата
7seg писал(а):В итоге код пока что такой получился после РЦ цепочки синус получается со сдвигом 120 , но без нее это полный трешь там и речи походу о 120 градусов нет
это вообще как? в первой части предложения получился синус со сдвигом, во второй части - опровержение... так получился или нет? не считая совсем неоптимального кода, логически все нормально, должно работать.

рекомендую:
1. сделать таблицу синуса размером 256 байт
2. поместить таблицу синуса во flash
3. вместо трех счетчиков использовать один, прибавляя к нему в нужные моменты "смещение" для 120 градусов
4. изучить принцип DDS и соответственно скорректировать код
5. использовать "оптимальные" типы данных (почему все int, когда на самом деле хватило бы uint8_t?)
6. не забывать про volatile для переменных, используемых в прерывании одновременно с основным кодом
7. активно применять static-переменные (счетчики фазы, например, незачем выносить в глобальную область)
8. не забывать про оптимизацию при компиляции!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Вот интересно из за чего ШИМ получается больше похож на пилу, когда должен быть формой прямоугольных импульсов.
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Кто ж вас знает, что вы там намудрили со схемой. МК выдает логические уровни, никаких пил там не бывает.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Осциллограмма с ног мк напрямую к оцилоскопу. походу где то в настройках ШИМа напортачил.
Разобрался почему осциллограмма 1 такая неправильная )) это все шпротеус. )

Пока код выглядит так

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

const unsigned char aSin[256]PROGMEM = {
	0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 4, 5, 6, 7, 8,
	9, 10, 12, 13, 15, 16, 18, 19, 21, 23, 25, 27, 29, 31, 33, 35,
	37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76,
	79, 81, 84, 87, 90, 93, 96, 99, 103,106,109,112,115,118,121,124,
	128,131,134,137,140,143,146,149,152,156,159,162,165,168,171,174,
	176,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216,
	218,220,222,224,226,228,230,232,234,236,237,239,240,242,243,245,
	246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,
	255,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,
	246,245,243,242,240,239,237,236,234,232,230,228,226,224,222,220,
	218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179,
	176,174,171,168,165,162,159,156,152,149,146,143,140,137,134,131,
	128,124,121,118,115,112,109,106,103,99, 96, 93, 90, 87, 84, 81,
	79, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39,
	37, 35, 33, 31, 29, 27, 25, 23, 21, 19, 18, 16, 15, 13, 12, 10,
	9, 8, 7, 6, 5, 4, 3, 3, 2, 1, 1, 0, 0, 0, 0, 0
};
uint8_t i1=0; //Переменная для подсчета элемента массива
uint8_t i2=43; //Переменная для подсчета элемента массива
uint8_t i3=85; //Переменная для подсчета элемента массива
uint8_t t1=0; // переменная для изменения частоты синуса (скорость прохода по массиву aSin )
ISR(TIMER0_OVF_vect)
{
	t1++;
	if (t1==5)
	{
	OCR1A=pgm_read_byte(&(aSin[i1]));
	OCR1B=pgm_read_byte(&(aSin[i2]));
	OCR2=pgm_read_byte(&(aSin[i3]));
	i1+=5;
	i2+=5;
	i3+=5;
	if (i1>255) i1=0;
	if (i2>255) i2=0;
	if (i3>255) i3=0;
	}
	if (t1>5) t1=0;
}

int main(void)
{
	PORTB=0x00;
	DDRB = (1<<PB0) |(1<<PB1) |(1<<PB2)| (1<<PB3);
	TCCR0=(0<<CS02)|(0<<CS01)|(1<<CS00);
	TCCR1A=(1<<COM1A1)|(0<<COM1A0)|(1<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(1<<WGM10);
	TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10);
	TCCR2=(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(0<<CS20);
	TIMSK=(0<<OCIE2)|(0<<TOIE2)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1)|(1<<TOIE0);
	
	sei();
	for (;;)
	{
	}
	return 0;
}
Для регулировки частоты синуса изменяю t1 вроде все нормально. залью на камушек посмотрю в живую что получаеться)
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

имхо вот эти строки лишние:
if (i1>255) i1=0;
if (i2>255) i2=0;
if (i3>255) i3=0;
переменная 8бит не будет больше 255 (сама сбросится по переполнению).
t1 не влияет на частоту, а только на нач фазу (скорость прироста всегда одинаковая)
а почему по 5 добавляешь (проскакивая по 4 элемента таблицы), добавляй по 1 (но почаще) - плавнее будет или вообще по t1 — вот и регулировка частоты как вариант.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3158301#p3158301"]В меге 3 таймера генерируют ШИМ - 2 канала TIMER1 и 1 канал TIMER2. Вам для 3 фаз придется задействовать все три.
Модуляцию, очевидно, придется возложить на незадействованный TIMER0 - куда деваться-то?[/uquote]
Так ясно куда деваться, на более дешевые мк с кучей таймеров, в том числе 32-х битных с полноценными 16-ти битными пределителями, но ты же никогда в этом не признаешься, проще отправить новичка изучать DDS :)
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Живая Осциллограмма выходов шим с МК:
СпойлерИзображение
Добавлено after 1 minute 36 seconds:
Жалко что только двух лучевой осцилоскоп есть.
Вложения
Живая осциллограмма.JPG
(192.7 КБ) 564 скачивания
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

а почему живая я не вижу анимации?

Добавлено after 35 seconds:
да и ее не бывае в жипеге тока GIF
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

#ОФФТОП
Живая в том смысле что с настоящего осциллографа :))
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

а мой совет насчет индексирования не учли... если к uint8_t i=255 прибавить 1, то автоматически получится 0, и никаких if-ов не надо делать - в том и фишка 255-байтового массива.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3158830#p3158830"]t1 не влияет на частоту, а только на нач фазу (скорость прироста всегда одинаковая)[/uquote]

Точнее меняя не т1 а условия if (t1==5).

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

ISR(TIMER0_OVF_vect)
{
   t1++;
   if (t1==5)
   {
   OCR1A=pgm_read_byte(&(aSin[i1]));
   OCR1B=pgm_read_byte(&(aSin[i2]));
   OCR2=pgm_read_byte(&(aSin[i3]));
   i1+=5;
   i2+=5;
   i3+=5;
   if (i1>255) i1=0;
   if (i2>255) i2=0;
   if (i3>255) i3=0;
   }
   if (t1>5) t1=0;
}
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

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

ISR(TIMER0_OVF_vect)
{
OCR1A=pgm_read_byte(&(aSin[i1]));
OCR1B=pgm_read_byte(&(aSin[i2]));
OCR2=pgm_read_byte(&(aSin[i3]));
i1+=t1;
i2+=t1;
i3+=t1;
}
вот так т1 влияет на частоту и этого достаточно.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Тогда регулировка получается чем выше частота тем меньше амплитуда.

А вроде для управления АД, должно быть наоборот или я ошибаюсь ?

Изображение

осциллограмма выход МК через РЦ фильтр.
andrei23061996@gmail.com
.................................................................................................................
Друг Кота
Аватара пользователя
Сообщения: 6643
Зарегистрирован: Чт авг 09, 2012 01:09:39
Откуда: Ливны

Сообщение korob »

7seg писал(а):А вроде для управления АД, должно быть наоборот или я ошибаюсь ?
Верно, не ошибаетесь. :) Правда для разных типов нагрузки на двигатель по разным законам, но во всех случаях с увеличением частоты растёт и напряжение.
Большой опыт, порой, не даёт находить/видеть нам простые и очевидные решения. :(
Всегда с уважением, Александр.
Ответить

Вернуться в «AVR»