Перейти к содержанию

Шим Синусоида С Тактированием От Фапч 64Мгц


nikakoy

Рекомендуемые сообщения

Может я чего недопонял, но тактировать AVRину от 64МГц как-то слишком много. Они вроде больше 20 МГц официально не держат. Ну если попадеся удачная - может 30-40 МГц потянет, но врядли. А протеусу без разницы что эмулировать. Я его заставлял ATtiny13 от 1 ГГц заводить. А если хочется точности синусоиды - возьмите хотя бы AT90S8515 и все 32 вывода на параллельный ЦАП. Утрирую, конечно, но то что ЦАП быстрее и точнее ШИМа - правда. Пример - КР572ПА2А из отечественных и AD7302BNZ из импортных ЦАП ну или самопальный вариант на резисторах.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

COKPOWEHEU, МК работает на 8МГц а вот таймер-счетчик на 64. Специальный режим такой. Поэтому то и пришлось изменить Attiny13 на Attiny25. В последнем есть режим тактирования таймер-счетчика от 64 Мгц PCK

Ссылка на комментарий
Поделиться на другие сайты

Хорошо. я протакие особенности не знал. Надобности не было. Спасибо что просветили :-)

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Пример - КР572ПА2А из отечественных и AD7302BNZ из импортных ЦАП ну или самопальный вариант на резисторах.

Тогда уж лучше ATmega16M1 со встроенным 10-ти разрядным ЦАПом.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Утрирую, конечно, но то что ЦАП быстрее и точнее ШИМа - правда.

Очень сомнительное утверждение.

Точность резистивного ЦАПа определяется точностью резисторов, разбросом и стабильностью сопротивления ключей и всяка проча подобна пакость.

В случае с ШИМом - точность выходного напряжения прежде всего определяется точностью и стабильностью времязадающего генератора. Что получить на практике весьма несложно. Даже нетермостатированные кварцы имеют 5...6 порядок точности и стабильности.

Насчет "быстрее" - тоже весьма условно. Если рассматривать резидентные модули МК, то наверное да. В общем случае - нет. Все зависит от цены, разрядности, манипуляций с опорой...

Да и чего там изобретать велосипеды?

Вспомним про сигма-дельта АЦП...

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Зато у параллельного ЦАП отсутствует шум квантования и скорость в принципе ограничена скоростью переключения логики.

ATmega16M1 не уверен что так просто найти.

Не понял как завести таймер tiny13/45/85 от внешней частоты. Даже ноги соответствующей. Наверное, плохо искал.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Зато у параллельного ЦАП отсутствует шум квантования

Куда же он делся?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

Ссылка на комментарий
Поделиться на другие сайты

Наверное, неточно выразился. У него гораздо слабее ВЧ-составляющая. Которая у него определяется в основном крутизной нарастания сигнала, а у ШИМ - несущей частотой.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Зато у параллельного ЦАП отсутствует шум квантования и скорость в принципе ограничена скоростью переключения логики.

Даже если принять следующую ниже за приведенной цитатой поправку о несущей ШИМа, то и тогда сказанное неверно.

Во первых, несущая ШИМа, как правило, в несколько раз выше частоты квантования. Значит ее подавление с помошью ФНЧ даже 3-его порядка (полюбасику его применять) составит минимум 20...30 дБ. Т.е. ситуация будет мало отличаться (если вообще будет) от резистивного ЦАПа.

Во вторых, утверждение о скорости переключения логики - ерунда полная. Скорость определится АНАЛОГОВЫМИ КЛЮЧАМИ. Т.е. их внутренним сопротивлением (постоянной времени: емкость нагрузки ЦАПа [вход. емкость ФНЧ] - сопротивление ключа). А у КМОП логики в МК сопротивление ключей весьма высоко - около 100 ом. Ну и точность самопальной матрицы будет отвратной.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

akwadag, вы б не могли выложить код своей программы? Судя по частоте вы использовали PLL. Просто у меня таймер-счетчик не запускается нивкакую... Вернее PLL не запускается так скажем. Мне бы хоть значения регистров глянуть чтоли, хотя сомневаюсь, что поможет но все же...

Изменено пользователем nikakoy
Ссылка на комментарий
Поделиться на другие сайты

COKPOWEHEU,

Не понял как завести таймер tiny13/45/85 от внешней частоты. Даже ноги соответствующей. Наверное, плохо искал.

не от внешней он заводится. В tiny25/45/85 есть внутренний синтезатор частоты на основе PLL (она же ФАПЧ на родном). Который можно использовать как тактовый только для первого таймер-счетчика. В tiny13 его нет! Именно изза этого от tiny13 пришлось отказаться, и именно изза этого глупого PLL весь проект застрял... :(

Изменено пользователем nikakoy
Ссылка на комментарий
Поделиться на другие сайты

akwadag, вы б не могли выложить код своей программы? Судя по частоте вы использовали PLL. Просто у меня таймер-счетчик не запускается нивкакую... Вернее PLL не запускается так скажем. Мне бы хоть значения регистров глянуть чтоли, хотя сомневаюсь, что поможет но все же...

SIN_PWM.rar

Изменено пользователем akwadag
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Проблемма решена программа работает. В чем ошибка? наверно в невнимательности. Спасибо akwadag за помощь содержательными ответами. Устройство протестировано и готовиться к внедрению. Код рабочей программы прилагаю

#include <tiny45.h> 
unsigned char i=1;
 // 256 значений синуса 
flash unsigned char  sine_form[]={127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,
   174,177,180,183,185,188,191,193,196,198,201,203,206,208,210,213,215,217,219,221,223,225,227,228,230,232,233,235,236,238,239,240,
   242,243,244,245,246,247,247,248,249,249,250,250,250,251,251,251,251,251,251,251,250,250,250,249,249,248,247,247,246,245,244,243,
   242,240,239,238,236,235,233,232,230,228,227,225,223,221,219,217,215,213,210,208,206,203,201,198,196,193,191,188,185,183,180,177,
   174,172,169,166,163,160,157,154,151,148,145,142,139,136,133,130,127,124,121,118,115,112,109,106,103,100,97,94,91,88,85,82,
   80,77,74,71,69,66,63,61,58,56,53,51,48,46,44,41,39,37,35,33,31,29,27,26,24,22,21,19,18,16,15,14,
   12,11,10,9,8,7,7,6,5,5,4,4,4,3,3,3,3,3,3,3,4,4,4,5,5,6,7,7,8,9,10,11,
   12,14,15,16,18,19,21,22,24,26,27,29,31,33,35,37,39,41,44,46,48,51,53,56,58,61,63,66,69,71,74,77,
   80,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124};


// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In 
// State5=T State4=T State3=T State2=T State1=0 State0=T 
PORTB=0x00;
DDRB=0x12;

// Timer/Counter 1 initialization
// Clock source: 64MHz PCK
// Clock value: 64000,000 kHz
// Mode: PWMA top=OCR1C
// OC1A output: Inverted, /OC1A disconnected
// OC1B output: Disconnected
// Timer1 Overflow Interrupt: On
// 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); //Ожидание захвата ФАПЧ около 100мс
// Enable the 64MHz clock
PLLCSR|=0x04;

TCCR1=0x51;
GTCCR=0x70;
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0xFF;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// Global enable interrupts
#asm("sei")

while (1)
     {

     // Place your code here

     };
}

// Прерывание по переполнению. 
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{

OCR1A=sine_form[i];  // запись следующего значения выборки в регистр ШИМ

       i=i+1;

}

единственное, что я не понял так это то почему не работает при эмуляции(и тестировании) моей програмки инверсный выход шима, а в проге akwadag работает. это не принципиально но все же интересно

Ссылка на комментарий
Поделиться на другие сайты

Хотя проблема решена, приведу код настройки PLL и таймера 1. В свое время тоже помучился

//-----------------------PLL_INIT-----------------------//
inline void pll_init(void)
{
 PLLCSR=(1<<PLLE);  //включаем PLL
 //Wait for PLL lock
 while ( !(PLLCSR & (1 << PLOCK)) ) {}
 PLLCSR = (1 << PCKE); //подключаем клок к таймеру
}
//======================================================//

//---------------------Инициализация ШИМ----------------//
inline void pwm_init(void)
{ //Start TCNT1 with prescaler 2
 //PWM ~16.0 KHz (use PLL, PaFC PWM mode)
 TCCR1B=(1 << CS11)|(0 << CS10);
 //Enable fault protection input on INT0 pin, falling edge.
 TCCR1D=(1 << FPIE1)|(1 << FPEN1)|(0 << FPES1);
 //Set dead-time.
 DT1=(DEAD_TIME << 4)|(DEAD_TIME);
 //Set PWM TOP value.
   TC1H=(PWM_TOP_VALUE >> 8); //организация доступа к 10-и
   OCR1C=(unsigned char)(PWM_TOP_VALUE);//разрядному регистру
}
//======================================================//

//---------------------------
inline void t1_set_mode(void)
{
  //Set PWM pins to input (Hi-Z) while changing modes.
  //DisablePWMOutputs();
 TC1H=0x00;
 TCNT1=0x00;

  //Set Timer/counter1 in dual slope PWM6 mode, clear on upcounting, set on downcounting (non-inverting).
 TCCR1A =(0<<7/*COM1A1*/) | (1 <<6 /* COM1A0*/) | (0<<5 /*COM1B1*/) | (1<<4/* COM1B0*/) | (1<<1/*PWM1A*/) | (1<<0/*PWM1B*/);
 TCCR1C =(0<<7/* COM1A1S*/) | (1 <<6/* COM1A0S*/) | (0<<5/* COM1B1S*/) | (1<<4/* COM1B0S*/) | (0<<3/* COM1D1)*/) | (1<<2/* COM1D0*/) | (1<<0/* PWM1D*/);
 TCCR1D|=(0<<1/*WGM11*/) | (1<<0/*WGM10*/);

// STEP = 0x00;

  //Set output duty cycle to 0
 // BlockCommutationSetDuty(0x0000);

 //fastFlags.driveWaveform = WAVEFORM_BLOCK_COMMUTATION;

   //Change PWM pins to output again to allow PWM control.
 // EnablePWMOutputs();
} 

//Ну и далее в маин
pll_init();
pwm_init();
t1_set_mode();
... 

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

Ссылка на комментарий
Поделиться на другие сайты

единственное, что я не понял так это то почему не работает при эмуляции(и тестировании) моей програмки инверсный выход шима, а в проге akwadag работает. это не принципиально но все же интересно

Думаю, вы и сами догадаетесь, почему, обратив внимание на значение DDRB в вашей программе.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 года спустя...

Расскажу небольшую предисторию. Все началось с того, что мне понадобился генератор синусоиды 1кГц максимально точной, но впринципе лиш бы на слух не заметно гармонических искажений. Частота должна быть стабильной, напряжение желательно 2 фиксированных 0.775В и 1.55В (знающие звукотехнику поймут почему именно такие напряжения). Версия сделать на рассыпухе отпала сразу, просто изза того что не интересно, да и зачастую требует много времени на настройку подгонку и т.д. Первой появилась идея сделать на NE555 (как здесь например) изза великой любви и уважения к данному таймеру, да и схемка встечалась. Но форма такого "синуса" не порадовала, и зависимость формы от нагрузки если не ставить повторитель. А тут еще и времени свободного много. Решил возобновить институтские знания по МК AVR. Наткунлся на Attiny13 и CodeVision. Спасибо CodeVision быстро написал программу протестил в протеусе все работает! Но не тут то оно было... Максимальная частота "красивого 8битного" синуса у этого МК получается не более 200Гц. Пытаясь уменьшить частоту выборок и и разрядность дошел до того что синус превратился в какуюто пилу недоделанную. Немного покопавшись в "интернетах" узнал, что есть отличные МК серии Attiny25/45/85 с 64МГц ШИМ и небольшой стоимостью около 16грн(2 у.е.). Отличный контроллер! Маленькое потребление, быстрый ШИМ, 2 таймера. 64 Мгц ШИМ дает возможность получить 8битный синус по 256 выборкам с частотой 64 000 000/(256*256) = 976,5625 Гц . Ну можно сказать 1кГц. Культурненько в CodeWizardAVR набросал нужные параметры добавил в проэкт ранее работавший на Attiny13 код. Но таймерсчетчик1 нивкакую не запускается. Пробовал как угодно, даже без ФАПЧ 64МГц но всеровно не работает. Вот только совсем отчаявшись решил написать, т.к. поиском даже примеров на Си не нашел для запуска быстрых таймеров для МК этой серии. Отладку и тестирование провожу в AVR Studio 4 и Proteus. Может кодевизард делает чтото не так? Читал и AVR131: Использование высокочастотной ШИМ микроконтроллеров AVR вроде все так.

вот код:

#include <tiny45.h>
unsigned char i=1;
// 256 значений синуса
flash unsigned char sine_form[]={127,130,133,136,139,142,145,148,151,154,157,160,163,166,169,172,
174,177,180,183,185,188,191,193,196,198,201,203,206,208,210,213,215,217,219,221,223,225,227,228,230,232,233,235,236,238,239,240,
242,243,244,245,246,247,247,248,249,249,250,250,250,251,251,251,251,251,251,251,250,250,250,249,249,248,247,247,246,245,244,243,
242,240,239,238,236,235,233,232,230,228,227,225,223,221,219,217,215,213,210,208,206,203,201,198,196,193,191,188,185,183,180,177,
174,172,169,166,163,160,157,154,151,148,145,142,139,136,133,130,127,124,121,118,115,112,109,106,103,100,97,94,91,88,85,82,
80,77,74,71,69,66,63,61,58,56,53,51,48,46,44,41,39,37,35,33,31,29,27,26,24,22,21,19,18,16,15,14,
12,11,10,9,8,7,7,6,5,5,4,4,4,3,3,3,3,3,3,3,4,4,4,5,5,6,7,7,8,9,10,11,
12,14,15,16,18,19,21,22,24,26,27,29,31,33,35,37,39,41,44,46,48,51,53,56,58,61,63,66,69,71,74,77,
80,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124};


// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

// Input/Output Ports initialization
// Port B initialization
// Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=In
// State5=T State4=T State3=T State2=T State1=0 State0=T
PORTB=0x00;
DDRB=0x02;

// Timer/Counter 1 initialization
// Clock source: 64MHz PCK
// Clock value: 64000,000 kHz
// Mode: PWMA top=OCR1C
// OC1A output: Inverted, /OC1A disconnected
// OC1B output: Disconnected
// Timer1 Overflow Interrupt: On
// 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); Ожидание захвата ФАПЧ около 100мс
// Enable the 64MHz clock
PLLCSR|=0x04;

TCCR1=0x71;
GTCCR=0x00;
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0x00;

// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// Universal Serial Interface initialization
// Mode: Disabled
// Clock source: Register & Counter=no clk.
// USI Counter Overflow Interrupt: Off
USICR=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here

};
}

// Прерывание по переполнению.
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{

OCR1C=sine_form[i]; // запись следующего значения выборки в регистр ШИМ

i=i+1;

}

плескалер не правильно инициализирован

Ссылка на комментарий
Поделиться на другие сайты

  • 5 лет спустя...

а как менять частоту синуса если он реализован через шим? если уменьшить on-time тогда амплитуда упадет, если менять дедтайм  только и то в узких пределах, чтоб ключи не пожечь

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Дмитрий Вас сказал:

а как менять частоту синуса если он реализован через шим? если уменьшить on-time тогда амплитуда упадет, если менять дедтайм  только и то в узких пределах, чтоб ключи не пожечь

Если вкратце то частотой смены "on-time"

ЗЫ
9 лет со времени создания темы, ура!)

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...