iltch
Участник-
Постов
37 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о iltch
-
Звание
Участник
-
А может быть дело в том что от модуля PWM приходит одно прерывание, а событий по этому прерыванию у меня 7. Я потом дополнительно выясняю что за событие вызвало прерывание. Вдруг во время обработки одного прерывания приходит другое которое я как то пропускаю? Думается мне что надо правильно воспользоваться критической секцией, но вот что то в голове нет понимания как правильно это сделать. Может кто нибудь из уважаемых форумчан посоветует как это правильно сделать? Заренее всем большое спасибо.
-
Добрый день господа форумчане. Сталкивался ли кто нибудь с такой проблемой, что при формировании ШИM-сигнала при помощи модуля PWM в сигнале возникают периоды когда выход остается в высоком уровне ? Код для работы с модулем PWM у меня такой: /* * ch3_8_hal.c * * Created on: 10.03.2012 * Author: Илья */ #include "LPC17xx.h" #define MR0_INT (1 << 0) #define MR1_INT (1 << 1) #define MR2_INT (1 << 2) #define MR3_INT (1 << 3) #define MR4_INT (1 << 8) #define MR5_INT (1 << 9) #define MR6_INT (1 << 10) #define TCR_CNT_EN 0x00000001 #define TCR_RESET 0x00000002 #define TCR_PWM_EN 0x00000008 #define PWMMR0I (1 << 0) #define PWMMR0R (1 << 1) #define PWMMR0S (1 << 2) #define PWMMR1I (1 << 3) #define PWMMR1R (1 << 4) #define PWMMR1S (1 << 5) #define PWMMR2I (1 << 6) #define PWMMR2R (1 << 7) #define PWMMR2S (1 << 8) #define PWMMR3I (1 << 9) #define PWMMR3R (1 << 10) #define PWMMR3S (1 << 11) #define PWMMR4I (1 << 12) #define PWMMR4R (1 << 13) #define PWMMR4S (1 << 14) #define PWMMR5I (1 << 15) #define PWMMR5R (1 << 16) #define PWMMR5S (1 << 17) #define PWMMR6I (1 << 18) #define PWMMR6R (1 << 19) #define PWMMR6S (1 << 20) #define PWMSEL2 (1 << 2) #define PWMSEL3 (1 << 3) #define PWMSEL4 (1 << 4) #define PWMSEL5 (1 << 5) #define PWMSEL6 (1 << 6) #define PWMENA1 (1 << 9) #define PWMENA2 (1 << 10) #define PWMENA3 (1 << 11) #define PWMENA4 (1 << 12) #define PWMENA5 (1 << 13) #define PWMENA6 (1 << 14) #define LER0_EN (1 << 0) #define LER1_EN (1 << 1) #define LER2_EN (1 << 2) #define LER3_EN (1 << 3) #define LER4_EN (1 << 4) #define LER5_EN (1 << 5) #define LER6_EN (1 << 6) #define ACTIVE_TAKT_1_CH3 2 #define ACTIVE_TAKT_2_CH3 12 #define ACTIVE_TAKT_1_CH4 2 #define ACTIVE_TAKT_2_CH4 12 #define ACTIVE_TAKT_1_CH5 3 #define ACTIVE_TAKT_2_CH5 11 #define ACTIVE_TAKT_1_CH6 3 #define ACTIVE_TAKT_2_CH6 11 #define ACTIVE_TAKT_1_CH7 4 #define ACTIVE_TAKT_2_CH7 12 #define ACTIVE_TAKT_1_CH8 4 #define ACTIVE_TAKT_2_CH8 12 static uint_fast8_t current_takt; //----------------------------------------------------------------------------- static void pwm_ch3_8_irq_hw (void) { volatile uint32_t regVal; volatile uint32_t load_value = 0ul; //__disable_fault_irq(); //__disable_irq(); regVal = LPC_PWM1->IR; LPC_PWM1->IR = regVal; /* clear interrupt flag on match 0 */ if( regVal & MR0_INT ) { if(LPC_PWM1->MR1) { if( current_takt == ACTIVE_TAKT_1_CH3 || current_takt == ACTIVE_TAKT_2_CH3 ) { load_value |= 0x00008000; } } if(LPC_PWM1->MR2) { if( current_takt == ACTIVE_TAKT_1_CH4 || current_takt == ACTIVE_TAKT_2_CH4 ) { load_value |= 0x00010000; } } if(LPC_PWM1->MR3) { if( current_takt == ACTIVE_TAKT_1_CH5 || current_takt == ACTIVE_TAKT_2_CH5 ) { load_value |= 0x00020000; } } if(LPC_PWM1->MR4) { if( current_takt == ACTIVE_TAKT_1_CH6 || current_takt == ACTIVE_TAKT_2_CH6 ) { load_value |= 0x00040000; } } if(LPC_PWM1->MR5) { if( current_takt == ACTIVE_TAKT_1_CH7 || current_takt == ACTIVE_TAKT_2_CH7 ) { load_value |= 0x40000000; } } LPC_GPIO0->FIOSET = load_value; /* swich on */ if(LPC_PWM1->MR6) { if( current_takt == ACTIVE_TAKT_1_CH8 || current_takt == ACTIVE_TAKT_2_CH8 ) { LPC_GPIO1->FIOSET = 0x00008000; } } //return; } load_value = 0ul; // Обнуляю переменную перед тем как использовать ее еще раз if( regVal & MR1_INT ) load_value |= 0x00008000; if( regVal & MR2_INT ) load_value |= 0x00010000; if( regVal & MR3_INT ) load_value |= 0x00020000; if( regVal & MR4_INT ) load_value |= 0x00040000; if( regVal & MR5_INT ) load_value |= 0x40000000; LPC_GPIO0->FIOCLR = load_value; if( regVal & MR6_INT ) LPC_GPIO1->FIOCLR = 0x00008000; // __enable_fault_irq(); // __enable_irq(); } //----------------------------------------------------------------------------- static void ch3_8_init_hw(void) { // Out_3, Out_4 LPC_PINCON->PINSEL0 &= 0x3FFFFFFF; // P0.15 as GPIO port LPC_PINCON->PINSEL1 &= 0xCFFFFFC0; // Настрою P0.16...P0.18, P0.30 как GPIO // и обнулю выходы LPC_PINCON->PINSEL2 &= 0x3FFFFFFF; // P1.15 as GPIO port LPC_PINCON->PINMODE0 &= 0x3FFFFFFF; // not pull-... mode LPC_PINCON->PINMODE0 |= 0x80000000; LPC_PINCON->PINMODE1 &= 0xCFFFFFC0; // not pull-... mode LPC_PINCON->PINMODE1 |= 0x2F00002A; LPC_PINCON->PINMODE2 &= 0x3FFFFFFF; // not pull-... mode LPC_PINCON->PINMODE2 |= 0x80000000; LPC_PINCON->PINMODE_OD0 &= 0xBFF87FFF; LPC_PINCON->PINMODE_OD1 &= 0xFFFF7FFF; LPC_GPIO0->FIODIR |= 0x40078000; LPC_GPIO0->FIOCLR = 0x40078000; LPC_GPIO1->FIODIR |= 0x00008000; LPC_GPIO1->FIOCLR = 0x00008000; // Следующие две строчки должны быть одикаковы для всех каналов PWM LPC_PWM1->TCR = TCR_CNT_EN | TCR_RESET; /* Counter enable, Counter Reset*/ LPC_PWM1->PR = 0ul; /* count frequency:Fpclk */ LPC_PWM1->MR0 = 0ul; LPC_PWM1->MR1 = 0ul; LPC_PWM1->MR2 = 0ul; LPC_PWM1->MR3 = 0ul; LPC_PWM1->MR4 = 0ul; LPC_PWM1->MR5 = 0ul; LPC_PWM1->MR6 = 0ul; LPC_PWM1->PCR = 0ul; LPC_PWM1->MCR = PWMMR0R | PWMMR0I | PWMMR1I | PWMMR2I | PWMMR3I | PWMMR4I | PWMMR5I | PWMMR6I; NVIC_SetPriority(PWM1_IRQn,0); NVIC_EnableIRQ(PWM1_IRQn); } //----------------------------------------------------------------------------- static void ch3_8_pwm_start_hw(void) { /* All single edge, all enable */ // LPC_PWM1->TCR &= ~(TCR_RESET); // LPC_PWM1->TCR |= TCR_PWM_EN; LPC_PWM1->TCR = 0x00000009; /* counter enable, ResetdisablePWM enable */ } //----------------------------------------------------------------------------- static void ch3_8_pwm_stop_hw(void) { LPC_PWM1->MR0 = 0ul; /* set PWM cycle */ /* set PWM offsets */ LPC_PWM1->MR1 = 0ul; LPC_PWM1->MR2 = 0ul; LPC_PWM1->MR3 = 0ul; LPC_PWM1->MR4 = 0ul; LPC_PWM1->MR5 = 0ul; LPC_PWM1->MR6 = 0ul; LPC_PWM1->LER |= 0x0000007F; LPC_PWM1->TCR |= TCR_RESET; /* Counter Reset */ LPC_GPIO0->FIOCLR = 0x40078000; LPC_GPIO1->FIOCLR = 0x00008000; } //----------------------------------------------------------------------------- static void ch3_8_pwm_set_freq_offset_hw(uint32_t cycle, uint_fast8_t takt, uint32_t* p_offset_arr) { uint32_t old_MR0; current_takt = takt; if(cycle == 0ul) { ch3_8_pwm_stop_hw(); old_MR0 = 0; return; } old_MR0 = LPC_PWM1->MR0; LPC_PWM1->MR0 = cycle; /* set PWM cycle */ /* The LER will be cleared when the Match 0 takes place, in order to load and execute the new value of match registers, all the PWMLERs need to reloaded. all PWM latch enabled */ LPC_PWM1->MR1 = *p_offset_arr; /* set PWM offsets */ LPC_PWM1->MR2 = *(p_offset_arr+1); LPC_PWM1->MR3 = *(p_offset_arr+2); LPC_PWM1->MR4 = *(p_offset_arr+3); LPC_PWM1->MR5 = *(p_offset_arr+4); LPC_PWM1->MR6 = *(p_offset_arr+5); LPC_PWM1->LER |= 0x0000007F; if(old_MR0 == 0ul) // См. data sheet значение регистра после сброса ch3_8_pwm_start_hw(); } У меня шесть выходов ШИМа работающих на одной частоте 80...200 Гц. У них разный DC. Управление периодом и DC сразу всех каналов ШИМа я осуществляю через функцию ch3_8_pwm_set_freq_offset_hw(). Из нее видно, что я сначала изменяю период ШИМа (регистр LPC_PWM1->MR0), затем меняю DC всех шести каналов, затем устанавливаю биты в регистре LPC_PWM1->LER, разрешая при следующем переполнении таймера модуля PWM переписать новые значения MR0... MR6 в теневые регистры модуля PWM. И обычно так и происходит. Но вот иногда происходит такая картина как первом рисунке. Иногда - это примерно один раз в 20 минут и случайно на одном из шести каналов. Сейчас удалось поймать на первом(MR1). Так кажется как будто не пришло прерывание от совпадения регистра MR1 и счетного регистра таймера PWM? Или как будто в теневой регистр MR1 записалось значение больше чем MR0? А может быть надо таймер PWM останавливать когда я обновляю регистры MR0....MR6, но в pdf ничего такого не написано? Не знаю что и думать.....
-
Добрый день. Нам в компанию нужен инженер-программист микроконтроллеров. Компания занимается производством медицинских и косметологических приборов. Требования к кандидату: 1) Знание схемотехники. 2) Умение работать в Altium Designer (схемы, разводка плат). 3) Умение программировать микроконтроллеры на С. (У нас используются микроконтроллеры LPC11хх, но не принципиально чтобы человек работал до этого именно с этими микроконтроллерами). 4) Умение не плохо программировать на каком нибудь объектно-ориентированном языке высокого уровня (C++, Java, TCL...). 5) Опыт работы от 2 лет. 6) Технический английский. Наша компания предлагает постоянную работу в районе метро "Пионерская", восьмичасовой рабочий день, оплачиваемый отпуск. Заработная плата: 45000... 50000 в зависимости от знаний и умений кандидата. Письма с резюме отправляйте на e-mail: [email protected]
-
Почему так сильно падает КПД?
iltch ответил iltch тема в Схемотехника
To yuri_d Провожу эксперимент и вижу - что потребление схемы 110 мА, откусываю диод и тут же потреблени повышается до 150 мА (Но зато осциллограммы сразу такие красивые...) Напряжение на нагрузке ~2.5 В, сопротивлени 25 Ом. Чисто активная нагрузка. Ну а раз ток потребления возрастает, то я делаю вывод, что КПД падает Но все равно есть ощущение, что без диода проектировать нельзя... Сегодня исследовал схему с диодом : у меня получилось КПД=77.6% (Без диода точное значение КПД не вычислял) -
Почему так сильно падает КПД?
iltch ответил iltch тема в Схемотехника
to MrAlex Да согласен, немного странная получился понижающий преобразователь у которого выходное напряжение (оно же напряжение нагрузки) привязано к напряжению питания, а не к земле... -
to proba60: Хотелось бы что бы вы чуть-чуть поподробнее рассказали назначение дополнительных элементов в схеме. Почему именно так. P.S: думаю что мне , все же такой, вариант не подойдет. У меня питание батарейное и каждый миллиампер на счету.
-
Почему так сильно падает КПД?
iltch опубликовал тема в Схемотехника
Вот схема пришлось мне сделать понижающий преобразователь по такой схеме: Все работает так как я хочу :а я хочу ток нагрузки ~100мА. И потребляет схема от источника ~150 мА. Но вот какое дело:я заметил, что если я уберу из этой схемы диод, то работать прежнему будет и потреблять вся схема от источника будет ~110 мА. Вот у меня вопрос почему же так падает КПД? С диодом на транзисторе нет бросков напряжения из за разрыва цепи с индуктивностью, но вот КПД? Диод же должен возвращать энергию накопленную в индуктивности обратно в источник, а похоже как будто он эту энергию аккуратненько на землю сливает (понимаю что это звучит по детски, но ощущения именно такие) Вот такие у меня наблюдаются осциллограммы: Напряжение питания 3.7 В, Частота ШИМ = 120 кГц, DC = 10% -
Прошу помощи еще раз.
iltch ответил iltch тема в Схемотехника
to 1113 Да вы правы ... Я ток конечно же биполярного транзистора этим резистором хочу ограничить. Это я ошибся когда сообщение писал. Отвлекли. Итак как выбирать Rз ? -
Прошу помощи еще раз.
iltch ответил iltch тема в Схемотехника
to 1113 резистор в схеме что бы ток полевого транзистора ограничивать -
Вот у меня вопрос организовался по поводу диода. Тут в этой ветке было несколько рекомендации про диод : 1) попробовать поставить диод между Б и Э , анодом к Б (гн. muravey) 2) Очень хорошо выправляет фронты включение диода Шоттки между коллектором и базой в "запертом" направлении (, гн. Меджикивис ) 3) Другой огород это поставить два диода. Один в базу, а другим охватить два перехода(первый диод и Б-К). Сопротивление между Б-Э в районе 1кОм. (гн. skyv) Вопрос 1: какой метод лучше? Вопрос 2: какой минимально достаточен?
-
Прошу помощи еще раз.
iltch опубликовал тема в Схемотехника
Уважаемые форумчане, добрый день. Объясните мне пожалуйста методику того как правильно рассчитать Rзатвора (Rз в схеме) полевого транзистора. Для конкретики я нарисовал такую схему: Транзистор у меня IRLML9301. Заранее всем большое спасибо за ответы. Написал сообщение и после сообразил, что не все данные по схеме привел. Частота ШИМ 120 КГц. Модератор: Картинки такие больше не грузите - неужто трудно нарисовать? Мегабайт на такую ерунду не нужно отнимать. Название должно быть осмысленным. Кому интересно, который раз Вы что0то там спрашиваете. Правила перечитайте. Тему переношу. Т. -
Решил делать ШИМ на полевике потому что он стоит 3 коп, а полевик 10 коп. и потому что они были под рукой.ю и потому что они во всех наших схемах стоят. Не приходил в голову что на такой низкой частоте возникнут проблемы.... Большое спасибо гн.-у muravei за совет с диодом. Еще помогло увеличение резистора от контроллера в базу. Меньше ток базы => не такое глубокое насыщение. гн.-у batmat От контроллера идет ШИМ строго 50%-ной скважности. А форма сигнала на базе искажена из-за рассасывания неосновных носителей заряда. Там между контроллером и базой еще резистор есть. Всем большое спасибо.
-
Уважаемые форумчане, тогда получается такая ситуация.... В datasheet-е (BC817 jn Fairchild) ни каких частотных или временных параметров нет кроме fT. А fT по словам гн. ТАУ это параметр не для ключевого режима. И как же тогда выбирать транзистор для работы с ШИМ-ом??? Хорошо теперь я знаю что у этого время рассасывания ~2,5 мкС. А как мне это предвидеть на этапе разработки схемы, когда еще и транзистора в наличии нету? И остался без ответа вопрос: Зачем в ставить резистор между базой и эмиттером? (По моему неосновные носители заряда должны стекать на землю через транзистор в порте контроллера)
-
Да время рассасывания в datasheeet не пишут..... Но ведь пишут что fT = 100 MГц!!!! Тогда что это за величина fT???? Может кто нибудь подскажет? Каналов у осциллографа два, но щуп один :-( Второй испортился. Но там видно по картинке (см. V_collector.png в первом посте (помним что там сигнал инвертирован)) выбросы они как раз соответствуют моментам когда контроллер переключает управляющий сигнал с 1 на 0.
-
Извините за задержку, надо было подключить схему к другой ножке порта и написать программу для этой ножки :-) Вот осциллограмма напряжения на базе транзистора: Как видно уже форма сигнала искажена. Вот осциллограмма напряжения на коллекторе. В первый раз выложил инвертированную осциллограмму спасибо что поправили На счет уменьшить резистор притягивающий базу к земле..... По моему это ничего не даст: неосновные носители заряда должны стекать на землю через транзистор порта микроконтроллера , я так думаю.