Страница 1 из 1
Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:05:34
geniusbsd
Требуется получить с помошью шим микроконтроллера 3-х фазное напряжение частотой 50Гц
Как это сделать не знаю
Помогите начинающиму кодом на С!!!
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:10:37
x-files
еще наверное и синус?

Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:11:58
pyzhman
Выложите, пожалуйста, весь текст задания. Как он задан.
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:20:59
Goldsmith
Насколько я помню, в примерах к VMLAB один из проектов как раз и есть трехфазный генератор синусоиды. Возьмите за образец.
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:30:22
CS16AMX
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:35:30
geniusbsd
Есть сельсин БС-1404 110В 50Гц. Будет использоваться как датчик(жестко связан с валом двигателя) Для снятия данных на трехфазную обмотку статора подается трехфазное напряжение (В обычном режиме работы сельсина напряжение синхронизации на статоре 50В) А с обмотки ротора через операционный усилить снимается сигнал. В прикрепленном файле подобная схема толька на PIC
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 09:52:57
pyzhman
Тогда уж и исходник PICa.
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 10:12:52
geniusbsd
pyzh_man писал(а):Тогда уж и исходник PICa.
В приложенном файле исходник на асм
Само описание в журнале радио № 4 за 2005год страница 63
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 18:39:57
geniusbsd
Вот кусок кода для генерации синусойды, но осциилограф показывает не синусойду а прямоугольник. Моделирую в протеусе
Код: Выделить всё
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "TableSin.h"
int main( void )
{
//инициализация портов
PORTB = 0;
DDRB = 0xff;
//инициализация таймера Т0
TIMSK = (1<<OCIE0);
//реж. - fast pwm, вывод OC0 - неинверт. шим, предделитель - на 8
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(0<<CS00);
//обнуляем счетный регистр и регистр сравнения
TCNT0 = 0;
OCR0 = 0;
//разрешаем прерывания
sei();
while(1);
return 0;
}
//**********************************************************
//Прерывание таймера/счетчика Т0
ISR(TIMER0_COMP_vect)
{
static unsigned char i = 0;
//считываем элемент массива из флэш памяти и записываем в регистр сравнения
OCR0 = pgm_read_byte(&TableSin[i]);
i++;
if (i == 130) i = 0;
}
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 19:37:34
ellioh
geniusbsd писал(а):Вот кусок кода для генерации синусойды, но осциилограф показывает не синусойду а прямоугольник. Моделирую в протеусе
Если прямоугольники с той частотой, которая должна быть, надо смотреть файл с данными синусоиды. А вот если с достаточно высокой частотой, это ШИМ так работает.

Он же генерирует импульсы длины, пропорциональной значению сигнала. Надо какую-то интегрирующую схему поставить, хотя бы подключить через резистор конденсатор (все параметры надо подбирать) и снимать напряжение с конденсатора.
Резистор подобрать так, чтобы даже при полностью разряженном конденсаторе при подаче напряжения 5В ток был не больше 20 мА. А конденсатор подбирать примерно так, чтобы время его заряда до половины через этот резистор было много больше периода импульсов, но много меньше периода синусоиды.
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 20:05:53
geniusbsd
ellioh писал(а):geniusbsd писал(а):ВНадо какую-то интегрирующую схему поставить, хотя бы подключить через резистор конденсатор (все параметры надо подбирать) и снимать напряжение с конденсатора.
Поставил сопротивление 470 и кондер 1мк и пошда синусойда
Re: Atmega16 3-х фазное напряжение
Добавлено: Чт апр 14, 2011 23:13:20
geniusbsd
Не получается запустить шим на таймере Т1
Делаю вот так инициализацию трех таймеров. Т0 и Т2 работают нормально а вот Т1 не запускается в чем может быть ошибка?
Код: Выделить всё
TIMSK = (1<<OCIE0|1<<OCIE2|1<<OCIE1A );
//реж. - fast pwm, вывод OC0 - неинверт. шим, предделитель - на 8
TCCR0 = (1<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS02)|(1<<CS01)|(0<<CS00);
TCCR2 = 0x6A;
TCCR1A = 0xA1;
//обнуляем счетный регистр и регистр сравнения
TCNT0 =0;
OCR0 = 0;
TCNT2 = 0;
OCR2 = 0;
TCNT1=0x00;
OCR1A=0x00;
...................
ISR(TIMER1A_COMP_vect)
{
static unsigned char i = 0;
//считываем элемент массива из флэш памяти и записываем в регистр сравнения
OCR1A = pgm_read_byte(&TableSin[i]);
i++;
if (i == 115) i = 0;
}