Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Программная инженерия > Микроконтроллеры, робототехника, схемотехника, 3D принтеры
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2017, 12:03   #1
Vozz
Новичок
Джуниор
 
Регистрация: 06.01.2017
Сообщений: 2
Печаль Трехфазный ШИМ

Всем привет. Написал программу для трехфазного ШИМ на микроконтроллере Атмега2560. Сначала попробовал заранее мной рассчитанный массив синуса. Все получилось, но впоследствии убедился, что трудновато будет осуществить сдвиг фаз. Поэтому решил рассчитывать массив формулой прямо в программе.

Программа:
Код:
/*
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <math.h>


             
float fa=1;   //Амплитуда фазы А
float fb=1; //Амплитуда фазы В
float fc=1; //Амплитуда фазы C


                                                              /*Функция прерывания*/


ISR (TIMER2_COMPB_vect)  {


int x={0}; float p = {3.14}; int z={254};

float sin_table[254] = {sin(2*p*x/z)*254};
x++;
							
OCR1A = sin_table[x];
 
	}

int main (void)
{
	
	                                                          /*Настраиваем выходы счетчиков для ШИМ*/
	
	
	PORTG=0x00; //Установили на всех выводах порта G лог "0"
	DDRG=0xFF; // Настроили  все ноги порта G как выходы   (Это ноги таймера "0")
	
	PORTB=0x00; //Установили на всех выводах порта B лог "0"
	DDRB=0xFF; // Настроили  все ноги порта B как выходы  (Это ноги таймера "1")
	
	PORTH=0x00; //Установили на всех выводах порта H лог "0"
	DDRH=0xFF; // Настроили  все ноги порта H как выходы  (Это ноги таймера "2 и 4")
	
	PORTE=0x00; //Установили на всех выводах порта E лог "0"
	DDRE=0xFF; // Настроили  все ноги порта E как выходы  (Это ноги таймера "3")
	
	PORTL=0x00; //Установили на всех выводах порта L лог "0"
	DDRL=0xFF; // Настроили  все ноги порта L как выходы  (Это ноги таймера "5")
	
	
	
	                                             /*Настраиваем канал OC0 для прохода по массиву. Нужно задать режим без предделителя, СТС*/
								
								
	
	TCCR2A = (1<<WGM21) | (1<<COM2A0) | (1<<COM2A1); 
    TCCR2B = (1<<COM2B0) | (1<<COM2B1) | (1<<CS21); // Настроили T2 СТС с PSC = 8
	TCNT2 = 0x00;
	OCR2A = 0x9D; // В регистр сравнения запихали число 157. На 157--м тике таймера TCNT2 сработает прерывание по СТС
	OCR2B = 0x00;
	ASSR=0x00; // Тактируемся от внутреннего источника частоты 
	
	
	
	/*Настраиваем T1. Пускай генерирует положительные полуволны для напряжения - Фаза А полож полуволна. Нам нужен режим FAST PWM, не инверт ШИМ, без предделителя*/
	
	
	TCCR1A = (1<<WGM00) | (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (1<<COM1C1) | (0<<COM1C0); // Режим без предделителя, FAST PWM
	TCCR1B = (1<<WGM12) | (1<<CS11); // 
	TCCR1C = 0x00;
	TCNT1=0x00; // счетный регистр = 0
	
	
	/*Настраиваем T3. Пускай генерирует отрицательные полуволны для напряжения - Фаза В отриц полуволна. Нам нужен режим FAST PWM, не инверт ШИМ, без предделителя*/
	
	TCCR3A = (1<<WGM30) | (1<<COM3A1) | (0<<COM3A0) | (1<<COM3B1) | (0<<COM3B0) | (1<<COM3C1) | (0<<COM3C0); // Режим без предделителя, FAST PWM
	TCCR3B = (1<<WGM32) | (1<<CS31); //
	TCCR3C = 0x00;
	TCNT3=0x00; // счетный регистр = 0
	
	
	
	OCR1AH=0x00;OCR1AL=0x00;  OCR1BH=0x00; OCR1BL=0x00; OCR1CH = 0x00; OCR1CL = 0x00;
	OCR3AH=0x00;OCR3AL=0x00;  OCR3BH=0x00; OCR3BL=0x00; OCR3CH = 0x00; OCR3CL = 0x00;
	
	
	TIMSK2 = (1<<OCIE2B); // Прерывание сработает при совпадении OC2B и счетного регистра. OCIE2B = 1
	sei(); // Разрешаем прерывание. Тут программа сигает вверх на ISR
	
	while (1)
	{
		
       // Бесконечный цикл. Если выполняется прерывание, то программа в цикл не заходит
		
	}
	
	;}
Все это дело заливаю в атмегу в протеусе. На OC1A атмеги тишина. Что не так?

Меняю фигурные скобки
Код:
{sin(2*p*x/z)*254}
на круглые (как и должно быть по идее) - появляется ошибка "invalid initializer"

Последний раз редактировалось Vozz; 06.01.2017 в 12:10.
Vozz вне форума Ответить с цитированием
Старый 06.01.2017, 20:55   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

какой ещё 3-фазный шим? Фаз двушка
На один ТПИ 2 фазы не повесишь
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зарубежные микроконтроллеры с встроенным ШИМ-генератором MyLastHit Компьютерное железо 6 22.10.2013 14:33
Программирование микроконтролера, реализация "скользящего среднего", ШИМ'а и ЧИМ'а Ozdiev Помощь студентам 1 03.04.2012 11:20
ШИМ для мк atmega8 pimple2006 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 09.02.2012 04:11
ШИМ для шагового двигателя V0lk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 04.01.2011 20:38