~Vad~ Опубликовано 3 июня, 2014 Поделиться Опубликовано 3 июня, 2014 Добрый день, стоит задача: формирование импульсов для управления тиристорным выпрямителем. Используем МК attiny2313. Написал программный шим, аттини немного не справляется с формированием(за все время формирования импульсов может пропустить 1-5 импульсов). Подскажите как можно оптимизировать код, чтобы облегчить жизнь тиньки #define F_CPU 8000000L #define start_timer 65490; #define Start 3 // ПУСК #define Rect 0 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define sm -40 // static int sync_idx = 0; const int PIN_NUM = 6; const int SYNC_NUM = 2; const int LEN = 2; int timer[sYNC_NUM] = {0,0}; int flag_sync; int pulses[sYNC_NUM][PIN_NUM][LEN]={ { {200,210}, {267,277}, {334,344}, {400,410}, {467,477}, {533,544}}, { {199,210}, {266,277}, {333,344}, {399,410}, {466,477}, {532,544}} }; int idx[sYNC_NUM][PIN_NUM]={{LEN,LEN,LEN,LEN,LEN,LEN},{LEN,LEN,LEN,LEN,LEN,LEN}};//{{{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN}},{{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN},{LEN,LEN}}}; const char pinMask[PIN_NUM][LEN] ={{0x04,0x08},{0x01,0x04},{0x10,0x01},{0x02,0x10},{0x20,0x02},{0x08,0x20}};//{0x0C, 0x05,0x11,0x12,0x22,0x28}; // TCK TBA TAK TCA TBK TAA const int pinMaskFlag[PIN_NUM][LEN]={{2,3},{0,2},{4,0},{1,4},{5,1},{3,5}}; // 0 01 1 02 2 04 3 08 4 010 5 020 //int flag[PIN_NUM]={0,0,0,0,0,0}; void init() //функция инициализации { // Конфигурируем порты на вход/выход //Порт Б DDRB 00111111 DDRB=0x3f; PINB=0x00; PORTB=0x00; //Порт D DDRD 00000001 DDRD=0x01; PIND=0x00; PORTD=0x00; // //конфигурируем прерывания TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //xtall/8 TIMSK |= (1<<TOIE1); TCNT1 = start_timer; PCMSK |= (1<<PIND2); MCUCR = (1<<ISC01) | (0<<ISC00); GIMSK |= (1<<INT0); //sei(); } // главная функция int main(void) { init(); pulses[0][0][0]=200+sm; pulses[0][0][1]=210+sm; pulses[0][1][0]=267+sm; pulses[0][1][1]=277+sm; pulses[0][2][0]=334+sm; pulses[0][2][1]=344+sm; pulses[0][3][0]=400+sm; pulses[0][3][1]=410+sm; pulses[0][4][0]=467+sm; pulses[0][4][1]=477+sm; pulses[0][5][0]=533+sm; pulses[0][5][1]=544+sm; for(int i=0;i<PIN_NUM;i++){ pulses[1][i][0]=pulses[0][i][0]-1; pulses[1][i][1]=pulses[0][i][1];} while(1) { if(PIND & 1<<Start) { PORTD &= ~(1<<Rect); for(int p=0;p<PIN_NUM;p++) { PORTB &=~ pinMask[p][0]; PORTB &=~ pinMask[p][1]; } pulses[0][0][0]=200+sm; pulses[0][0][1]=210+sm; pulses[0][1][0]=267+sm; pulses[0][1][1]=277+sm; pulses[0][2][0]=334+sm; pulses[0][2][1]=344+sm; pulses[0][3][0]=400+sm; pulses[0][3][1]=410+sm; pulses[0][4][0]=467+sm; pulses[0][4][1]=477+sm; pulses[0][5][0]=533+sm; pulses[0][5][1]=544+sm; for(int i=0;i<PIN_NUM;i++){ pulses[1][i][0]=pulses[0][i][0]-1; pulses[1][i][1]=pulses[0][i][1]; } sync_idx=0; timer[0]=0; timer[1]=0; for(int i=0;i<SYNC_NUM;i++) for(int j=0;j<PIN_NUM;j++) idx[i][j]=LEN; } if(!(PIND & 1<<Start)){//на схеме обратная логика _delay_us(10);// исключение дребезга //sync_idx=0; sei(); } while(!(PIND & 1<<Start)) { //if(flag_sync>0){ for (int s = 0; s < SYNC_NUM; s++){ for (int p = 0; p < PIN_NUM; p++){ if (idx[s][p] < LEN){ if (timer[s] >= pulses[s][p][idx[s][p]]){ if (idx[s][p]&1 ){ if(pulses[0][0][0]>100) PORTB &=~ pinMask[p][0]; PORTB &= ~pinMask[p][1]; } else{ PORTB |= pinMask[p][0]; if(pulses[0][0][0]>100) PORTB |= pinMask[p][1]; pulses[s][p][idx[s][p]]--; } idx[s][p] ++; } } } } if(pulses[1][0][0]<=1) { cli(); PORTD |= (1<<Rect); for(int p=0;p<PIN_NUM;p++) { PORTB |= pinMask[p][0]; PORTB |= pinMask[p][1]; } } //} } } return 0; } // прерывание по вектору INT0 (прерывание по синхронизации - спад из 1 в 0 ISR(INT0_vect){ timer[sync_idx] =0; for (int p = 0; p < PIN_NUM; p++) idx[sync_idx][p] = 0; if (++sync_idx >= SYNC_NUM) sync_idx = 0; } ISR( TIMER1_OVF_vect ) { TCNT1 = start_timer; {timer[0]++; timer[1]++;} } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
artos5 Опубликовано 3 июня, 2014 Поделиться Опубликовано 3 июня, 2014 Что то не вкурю.... А зачем тут такие "жирные" массивы? Да и вообще, зачем они? 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Реле, вентиляторы, корпуса, разъемы, а так же любые электронные компоненты в нашем каталоге! Бесплатная доставка + 15% кэшбэк + скидки!Перейти на сайт ТМ Электроникс Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
~Vad~ Опубликовано 3 июня, 2014 Автор Поделиться Опубликовано 3 июня, 2014 (изменено) В массиве я храню время начала формирования импульса, и время его закрытия. Получается 2 массива данных для двух пачек импульса. Сначала формируется первая пачка от момента спадающего импульса синхронизации, пока первая формируется - уже наступает второй импульс синхронизации, и начинается формироваться вторая пачка. Таким образом они чередуются(чет-нечет). Понимаю что алгоритм использован дубовый, пытался несколько иначе сделать, но этот - наиболее работающий. Изменено 3 июня, 2014 пользователем ~Vad~ 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
artos5 Опубликовано 3 июня, 2014 Поделиться Опубликовано 3 июня, 2014 Слишком избыточно... так работать корректно не будет... Я когда разрабатывал в Полуавтомат управление - делал все без использования массива. И диодно-тиристорный мост работает идеально. И симистор тоже идеально 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке. Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
~Vad~ Опубликовано 3 июня, 2014 Автор Поделиться Опубликовано 3 июня, 2014 (изменено) Я понимаю, что избыточно- МК постоянно прогоняет весь массив, чтобы включить только одну пару импульсов. Отказаться от массивов хорошая идея, попробую ее реализовать. Если вернуться к моему коду, подскажите пожалуйста идея правильная(если не брать в расчет массивы), или алгоритм надо строить совершенно по другому? Если Вам не сложно, подскажите алгоритм, хотя бы на пальцах. Изменено 3 июня, 2014 пользователем ~Vad~ 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Литиевые батарейки и аккумуляторы от мирового лидера EVE в КомпэлКомпания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
artos5 Опубликовано 3 июня, 2014 Поделиться Опубликовано 3 июня, 2014 У меня алгоритм такой: при захвате перехода через ноль , запускаемых таймер на время равное настроенной мощности Р - 100. При событии прерывания - даем импульс на тиристоры. Импульс сбрасываем через 1мс. или при следующем переходе через ноль. И никаких массивов! У меня ещё и динамическая индикация крутится , и все успевает ПС : исправьте предыдущие посты! Не цитируйте целиком пред. сообщение! Вот статья и схема: cxem.net/house/1-269.php 0 Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.