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

Прошу Совета По Оптимизации(Программный Шим)


~Vad~

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

Добрый день, стоит задача: формирование импульсов для управления тиристорным выпрямителем. Используем МК 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]++;}
}

ekbZT-n8PoY.jpg

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

Что то не вкурю.... А зачем тут такие "жирные" массивы? Да и вообще, зачем они? :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

В массиве я храню время начала формирования импульса, и время его закрытия. Получается 2 массива данных для двух пачек импульса. Сначала формируется первая пачка от момента спадающего импульса синхронизации, пока первая формируется - уже наступает второй импульс синхронизации, и начинается формироваться вторая пачка. Таким образом они чередуются(чет-нечет). Понимаю что алгоритм использован дубовый, пытался несколько иначе сделать, но этот - наиболее работающий.

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

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

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

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

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

Слишком избыточно... так работать корректно не будет... Я когда разрабатывал в Полуавтомат управление - делал все без использования массива. И диодно-тиристорный мост работает идеально. И симистор тоже идеально :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

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

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

Я понимаю, что избыточно- МК постоянно прогоняет весь массив, чтобы включить только одну пару импульсов. Отказаться от массивов хорошая идея, попробую ее реализовать. Если вернуться к моему коду, подскажите пожалуйста идея правильная(если не брать в расчет массивы), или алгоритм надо строить совершенно по другому? Если Вам не сложно, подскажите алгоритм, хотя бы на пальцах.

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

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

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

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

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

У меня алгоритм такой:

при захвате перехода через ноль , запускаемых таймер на время равное настроенной мощности Р - 100.

При событии прерывания - даем импульс на тиристоры.

Импульс сбрасываем через 1мс. или при следующем переходе через ноль. И никаких массивов! У меня ещё и динамическая индикация крутится , и все успевает :)

ПС : исправьте предыдущие посты! Не цитируйте целиком пред. сообщение!

Вот статья и схема: cxem.net/house/1-269.php

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

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

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

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

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

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

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

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

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

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

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

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