Jump to content
Sign in to follow this  
mr_smit

DMA + таймер. ШИМ из массива.

Recommended Posts

Вынес то что не получается в упрощенной форме в отдельный проект. Среда разработки CooCox 1.7.8, микроконтроллер STM32F103C8T6.

Нужно раз в ~100 мсек формировать на ножке МК, например,такую последовательность:

1.thumb.PNG.bdb3a046fcb45b4872130a318ee2079c.PNG

Стартовую длительность формирует таймер, в первом же своем прерывании по совпадению активирует DMA и дальше уже DMA по запросу таймера загружает значение CCR из массива. Что то похожее на управление светодиодами WS2812B. То что я сочинил выдает на пин:

2.png.148f0b4f323031f20a94e39f2c6f3d35.png

Но только один раз при первом вызове. При последующих вызовах данные из массива выдаются без первоначальной длительности в 150 мкс.

Не могу найти ошибку. 

 

#include <stm32f10x.h>
#include <stm32f10x_conf.h>
#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_tim.h>
#include <stm32f10x_dma.h>

GPIO_InitTypeDef         PIN;
TIM_TimeBaseInitTypeDef  TIM_Config;
TIM_OCInitTypeDef        TIM_OCConfig;
DMA_InitTypeDef          DMA_Setting;

uint8_t Test_Buf[] = {15,30,30,30,15};

void delay_ms(uint32_t ms) {
	volatile uint32_t nCount;
	RCC_ClocksTypeDef RCC_Clocks;
	RCC_GetClocksFreq (&RCC_Clocks);
    nCount = (RCC_Clocks.HCLK_Frequency/10000)*ms;
    for (; nCount != 0; nCount--);
}

void Init_GPIO(void) {

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

	PIN.GPIO_Pin =  GPIO_Pin_11;         // PA11 -> TIM1 Channel4
	PIN.GPIO_Mode = GPIO_Mode_AF_PP;
	PIN.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &PIN);
}

void Init_TIM_Transmit(void) {
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

	TIM_TimeBaseStructInit(&TIM_Config);              // настройки по дефолту
	TIM_Config.TIM_Prescaler = 72-1;                  // Запускаем таймер на тактовой частоте 1 MHz (72000000/(72-1))
	TIM_Config.TIM_Period = 150-1;                    // Период - 150 мкс
	TIM_Config.TIM_ClockDivision = 0;                 // частоту дополнительно не делим
	TIM_Config.TIM_CounterMode = TIM_CounterMode_Up;  // считаем вверх
	TIM_TimeBaseInit(TIM1, &TIM_Config);              // Инициализируем TIM1

	TIM_OCStructInit(&TIM_OCConfig);                       // настройки по дефолту
	TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;             // Конфигурируем как ШИМ (выравнивание по границе)
	TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable; // Включаем выход
	TIM_OCConfig.TIM_Pulse = 0;                            // CCR до старта пока нулевой
	TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;     // Полярность
	TIM_OCConfig.TIM_OCIdleState = TIM_OCIdleState_Reset;  // состояние выхода по совпадению CCR (сброс)

	TIM_OC4Init(TIM1, &TIM_OCConfig);                      // Инициализируем 4-й выход таймера, это PA11
	TIM_ARRPreloadConfig(TIM1,ENABLE);                     // Предзагрузка периода (ARR)
	TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);      // Предзагрузка длины импульса CCR 4-го канала
                                                           // (даем досчитать до конца и только потом значение меняется на новое)
	TIM_DMACmd(TIM1,TIM_DMA_CC4,DISABLE);                  // выключаем пока запрос к DMA от таймера TIM1 по достижении CCR)

	TIM_CtrlPWMOutputs(TIM1, ENABLE);                      // включаем выходы (это только для TIM1)
	TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Enable);         // разрешаем таймеру управлять выводом PA11
	TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE);               // запрещаем пока таймеру генерировать прерывание по совпадению
    NVIC_EnableIRQ(TIM1_CC_IRQn);                          // разрешаем прерывания
	TIM_Cmd(TIM1, DISABLE);                                // Выключаем таймер (пока ждем)
}

void TIM1_CC_IRQHandler(void)                               // прошло 130 мкс
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) {         // по совпадению
	TIM_ClearITPendingBit(TIM1,TIM_IT_CC4);                 // сбрасываем флаг прерывания TIM1 по совпадению
  }

  NVIC_EnableIRQ(TIM1_CC_IRQn);                             // выключаем прерывания от таймера
  TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE);                  //

  TIM1->ARR = 40-1;                                         // устанавливаем период 40 мкс
  TIM1->CCR4 = Test_Buf[0];                                 // ширину из массива для следующего импульса

  DMA1_Channel4->CNDTR = 4;                // длина данных для DMA на 1 меньше т.к. уже установили выше 1 элемент

  TIM_DMACmd(TIM1,TIM_DMA_CC4,ENABLE);     // разрешаем таймеру делать запрос к DMA по совпадению CCR
  DMA_Cmd(DMA1_Channel4, ENABLE);          // включаем DMA
}

void Init_DMA(void)
{
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);                     // включаем тактирование DMA1

	DMA_Setting.DMA_PeripheralBaseAddr = (uint32_t) &TIM1->CCR4;           // куда копировать
	DMA_Setting.DMA_MemoryBaseAddr = (uint32_t) &Test_Buf[1];              // что копировать
	DMA_Setting.DMA_DIR = DMA_DIR_PeripheralDST;                           // копируем в периферию (Peripheral Destination, точка назначения - периферия)
	DMA_Setting.DMA_BufferSize = 0;                                        // количество передаваемых данных
	DMA_Setting.DMA_PeripheralInc = DMA_PeripheralInc_Disable;             // адрес периферии постоянный
	DMA_Setting.DMA_MemoryInc = DMA_MemoryInc_Enable;                      // адрес в памяти увеличиваем
	DMA_Setting.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  // периферия 16 бит
	DMA_Setting.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;              // массив 8 бит
	DMA_Setting.DMA_Mode = DMA_Mode_Normal;                                // режим обычный
	DMA_Setting.DMA_Priority = DMA_Priority_Medium;                        // приоритет средний
	DMA_Setting.DMA_M2M = DMA_M2M_Disable;                                 // MemoryToMemory откл.

	DMA_Init(DMA1_Channel4, &DMA_Setting);             // TIM1_CH4 относится к 4-му каналу DMA1
    DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);    // настраиваем прерывание по окончанию передачи
    NVIC_EnableIRQ(DMA1_Channel4_IRQn);                // включаем прерывания от 4-го канала DMA1
    DMA_Cmd(DMA1_Channel4, DISABLE);                   // пока выключаем 4-ый канал DMA1
}

void DMA1_Channel4_IRQHandler(void)                    // закончили передавать
{
	if (DMA_GetITStatus(DMA1_IT_TC4) != RESET) {       // по совпадению
		DMA_ClearITPendingBit(DMA1_IT_TC4);            // сбрасываем флаг прерывания DMA1 Channel4 transfer complete
		}
	if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) {  // по совпадению
		TIM_ClearITPendingBit(TIM1,TIM_IT_CC4);        // сбрасываем флаг прерывания TIM1 на всякий случай
		}

	TIM1->ARR = 150-1;        // вновь настраиваем на период 150 мкс
	TIM1->CCR4 = 0;           // и ждем следующею передачу
	TIM1->CNT  = 0;           //

	TIM_DMACmd(TIM1,TIM_DMA_CC4,DISABLE);              // всё выключаем
	DMA_Cmd(DMA1_Channel4, DISABLE);                   //
	TIM_Cmd(TIM1, DISABLE);                            //
	TIM_ITConfig(TIM1, TIM_IT_CC4, DISABLE);           //

	TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Disable);
}

int main(void)
{
	Init_GPIO();
	Init_TIM_Transmit();
	Init_DMA();

	delay_ms(1000);

    while(1)
    {
    	TIM1->CCR4 = 130-1;                // до включения линия удерживается в 0 (CCR=0)
    	TIM_ITConfig(TIM1, TIM_IT_CC4, ENABLE);
    	TIM_CCxCmd(TIM1,TIM_Channel_4,TIM_CCx_Enable);
    	TIM_Cmd(TIM1, ENABLE);

    	delay_ms(100);
    }
}

 

TEST_TIM_DMA.zip

Share this post


Link to post
Share on other sites

Смотри что перед повторном включении в статусе таймера, ну и гаси флажки. В SPL ничего не смыслю.

Share this post


Link to post
Share on other sites

Утро вечера мудренее. Сам разобрался. В процессе переехал на другой таймер, на нем и оставил. Прерывания таймера не используются. Полностью на DMA. На мой взгляд получилось красиво.

1_.PNG.fe127e5867da4244546da4c6f1c35f48.PNG

#define Imp_Length  130   // длина первого импульса
#define Imp_Period  150   // период первого импульса
                          // период остальных 40 мкс
                          // длины из массива

volatile uint8_t Start_Imp = 1;

static uint8_t Exp_Buf[7] = {Imp_Length,15,30,30,30,15,0};   // сам массив с длинами в мкс {15,30,30,30,15}
                                                             // нулевой элемент это длина первого импульса
                                                             // 0 в конце для DMA
...

void DMA1_Channel6_IRQHandler(void)                    
{
  DMA_ClearITPendingBit(DMA1_IT_TC6);

  if (Start_Imp != 0) {

	  Start_Imp =0;
	  TIM3->ARR = 40-1;           // период остальных импульсов 40 мкс (после первого импульса)

	  DMA_Cmd(DMA1_Channel6, DISABLE);
	  DMA1_Channel6->CMAR = (uint32_t) &Exp_Buf[2];
	  DMA1_Channel6->CNDTR = sizeof(Exp_Buf)-2;
	  DMA_Cmd(DMA1_Channel6, ENABLE);
  }
  else {
	  Start_Imp =1;

	  TIM_Cmd(TIM3, DISABLE);
	  DMA_Cmd(DMA1_Channel6, DISABLE);

	  TIM3->ARR = Imp_Period-1;

	  DMA1_Channel6->CMAR = (uint32_t) &Exp_Buf[0];
	  DMA1_Channel6->CNDTR = 2;
  }
}

int main(void)
{
	Init_GPIO();
	Init_DMA();
	Init_TIM_Transmit();

    while(1)
    {
    	delay_ms(200);

    	TIM3->CCER |= TIM_CCER_CC1E;

    	DMA_Cmd(DMA1_Channel6, ENABLE);
    	TIM_Cmd(TIM3, ENABLE);
    }
}

Ну и архив с исходником

TEST_TIM_DMA.rar

Share this post


Link to post
Share on other sites

Конденсаторы Panasonic. Часть 4. Полимеры – номенклатура

В заключительной, четвертой статье из цикла «Конденсаторы Panasonic» рассматриваются основные достоинства и особенности использования конденсаторов этого японского производителя на основе полимерной технологии. Главной конструктивной особенностью таких конденсаторов является полимерный материал, используемый в качестве проводящего слоя. Полимер обеспечивает конденсаторам высокую электрическую проводимость и пониженное эквивалентное сопротивление (ESR). Номинальная емкость и ESR отличается в данном случае высокой стабильностью во всем рабочем диапазоне температур. А повышенная емкость при низком ESR идеальна для решения задач шумоподавления и ограничения токовых паразитных импульсов в широком частотном диапазоне.

Читать статью

В 05.04.2019 в 14:48, mr_smit сказал:

 На мой взгляд получилось красиво.

 

 

Увы это не так. Сплошные костыли .

Начни изучать таймеры как таковые ,а в частности DMA burst...

Share this post


Link to post
Share on other sites
11.07.2019 в 09:42, dosikus сказал:

Увы это не так. Сплошные костыли .

Начни изучать таймеры как таковые ,а в частности DMA burst...

Не вполне корректная рекомендация: DMA в линейке F1 не поддерживает режим burst.

Share this post


Link to post
Share on other sites
                     

STM32G0 - средства противодействия угрозам безопасности

Результатом выполнения требований безопасности всегда является усложнение разрабатываемой системы. Особенно чувствительными эти расходы стали теперь, в процессе массового внедрения IoT. Обладая мощным набором инструментов информационной безопасности, микроконтроллеры STM32G0 производства STMicroelectronics, объединив в себе невысокую цену, энергоэффективность и расширенный арсенал встроенных аппаратных инструментов, способны обеспечить полную безопасность разрабатываемого устройства.

Подробнее...

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By Павел Лопатин
      Добрый день!
      Подскажите, пожалуйста, можно ли вынести переменный резистор 16K1-B10K, L20KC, 10 кОм с ШИМ регулятора на отдельную плату? 
      Какие провода лучше использовать? На какое расстояние можно вынести (длина провода) и изменятся ли от этого характеристики? (все-таки, как я понимаю, появится дополнительное сопротивление от провода)
      ШИМ покупной в RDC2-0024 - фото и схема в аттаче
      DOC002726141.pdf
    • By Kirillius Labutin
      Добрый день!
      Имеется готовый лазерный модуль с драйвером (стабилизатор тока и, наверное, напряжения). 
      Хочу регулировать яркость лазера с помощью ШИМ с МК, гугл сказал что лучший вариант - шунтирование лазера. Но драйвер устроен таким образом, что в нём с питанием напрямую не связан ни "+" ни земля лазера. Набросал такую схемку, чтобы реализовать это через оптопару.

      Внимание, вопрос)
      1. Заработает ли такая схема?
      2. Какой посоветуете транзистор Q1 и оптопару? Макс. напряжение в цепи - 5В, ток - 0.5А Я думаю что-нибудь вроде IRLL014TRPBF
      3. Какой выбрать номинал резистора R1 для разряда Q1? Частота ШИМ планируется в районе 1кгц.
    • By SigmA
      Доброго времени суток всем. Для своей новой жены захотелось мне сделать сердечко на atmega8, с кучей эффектов и т.д. Так вот, разные мигалки-переключалки св-диодов я написал, использовал delay. Но мне этого стало мало и я решил подключить шим программный. Отдельно от всей программы шим работает как нужно, так же и переключалки работают отдельно от шим, но вот когда я соединяю это всё воедино то работает только шим и не переходит дальше по коду.Я так понимаю, что таймеры и delay вместе работать не могут? Но если могут, то как?
      #include <mega8.h> #include <delay.h> #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 unsigned char i, s,; unsigned char green=255; unsigned char green_b; //переменные, для буферизации значений скважности ШИМ unsigned char count; //переменная- счетчик вызовов обработчика прерываний unsigned char temp=1; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { count++; if (count == 0){ //если счетчик переполнился и принял значение 0 green_b = green; GREEN = 1; } if (green_b == count) { GREEN = 0;} } void main(void) { PORTC=0x0F; //конфигурируем порт DDRC=0x0F; TCCR0=0x01; //настраиваем таймер TCNT0=0x00; TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0 #asm("sei") //глобально разрешаем прерывания while (1) { for (i=0;i<3;i++) { if (temp==1) {if (green < 255) green += 1; else temp = 2;} if (temp==2) {if (green > 0) green -= 1; else temp = 1;} delay_ms(1000); }; s=7; for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.0=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.3=1; delay_ms(200); PORTC.3=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.3=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.0=1; delay_ms(200); PORTC.0=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.2=1; delay_ms(200); ; PORTC.1=1; delay_ms(200); PORTC.0=1; delay_ms(200); PORTC.3=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.0=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.1=1; delay_ms(200); ; PORTC.2=1; delay_ms(200); PORTC.3=1; delay_ms(200); PORTC.0=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.3=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC=0x01; delay_ms(200); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x09; delay_ms(200); PORTC=0x0A; delay_ms(200); PORTC=0x0C; delay_ms(200); PORTC=0x0D; delay_ms(200); PORTC=0x0E; delay_ms(200); PORTC=0x0F; delay_ms(200); PORTC=0x07; delay_ms(150); PORTC=0x0B; delay_ms(200); PORTC=0x03; delay_ms(250); PORTC=0x05; delay_ms(300); PORTC=0x09; delay_ms(350); PORTC=0x01; delay_ms(400); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x00; delay_ms(200); } for (i=0;i<=5;i++) { PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(1000); } } }  
    • By IgnatiusF
      Не могу настроить таймер 0 на работу, и даже не получается понять в чем проблема. Делаю в Proteus, так как это быстрее и нагляднее.
      Пробовал и просто по переполнению делать прерывание (WGM[1..0]  00) и по совпадению (WGM[1..0]  10; OCR0A = 0 - 255), однако прерываний нет. Перед циклом ставлю TCNT0 = 0;
      Тактирование выставляю TCCR0B (CS[2..0] 001, 100, 101).
      Прерывания TIMSK0 (OCIE0A, TOIE0) выставляю, не вызываются. Даже принудительным заносом значения в регистр TIFR0 (OCF0A, TOV0).
      Прерывание пытаюсь выполнить таким образом:
      #include <avr/interrupt.h> volatile unsigned int A = 0; ISR(TIMER0_OVF_vect) { A = 1; } ... while(1) { if (A == 1) PORTB |= (1<<0); } Proteus показывает, что вывод настроен как выход, но всегда 0;
      Конкретный код привести не могу, так как у меня не заработало совсем ничего.
      Внизу я сделал вырезку из даташита на ATMEGA328 по 0 таймеру 8-бит, и занес в один PDF файл.
      ATmega328-106-112.pdf
      Прошу помочь разобраться с таймером и прерываниями для него.
  • Сообщения

    • Теперь, БП работает нормально? Под нагрузкой просадки какие?   Номинал большой. Вот для стабилизированного варианта, он больше подходит
    • Ламптест свидетельствует только о стабильности яркости свечения ламп. И ни капелюшечки об их надежности.
    • Так это не характерный вид ограничения для усилителя? Из-за чего это ограничение? Я не понимать( предел этой схемы? Так и нет же ее совсем... Кроме внутренней в самой лампе, но ее то не убрать... Если предварительный каскад не входит в ограничение может быть виноват выходной трансформатор? Ну это не сложно. Вытащу резистор "антизвон" и проверю. Дома есть один в один усилитель только предварительный каскад с параллельным включением. Его я гоняю без настройки, каюсь... Притащу, проверю тогда на днях. Если картина другая то "идеальный драйвер" слабоват.
    • блин... ДГС не стабилизирует напряжения, а выравнивает, сам он не за чем не следит, просто пропорционально току протекающему через одну обмотку, на второй обмотке наводится напряжение (встречный ток), встречное к питающему, и это наведение подобрано так, чтоб компенсировать изменения напряжения во вторичной цепи выхода в котором произошли изменения, для другого выхода.  Например - нет ДГС. Допустим, что регулятор стабилизирует напряжение только по первому выходу, - чисто для пояснения роли ДГС и его функции. Есть некоторая амплитуда и ширина импульсов, при которой напряжение близко к образцовому. Произошли изменения: напряжение в сети снизилось, нагрузка выросла по первому выходу... напряжение на первом выходе стало меньше образцового. регулятор увеличивает ширину импульсов и доводит напряжение до нормы по первому выходу. А в это время, на втором выходе, напряжение выросло, на величину падения во вторичной цепи первого выхода. Но вот установили ДГС, и напряжение на втором выходе снизилось пропорционально току по первому выходу. Вот на численном примере Было по 10 вольт на обоих выходах, На первом выходе ток потребления вырос на 1 Ампер, и напряжение на нём упало до 9 Вольт. Напряжение на втором выходе упало до 9,5 Вольт (пол вольта упало в первичке, пол во вторичке, поэтому на втором выходе на пол вольта, так как во вторичке у него потерь не было). Регулятор увеличивает ширину импульсов и доводит напряжение на первом выходе до 10 Вольт, а напряжение на втором выходе становится 10,5 Вольт, эти лишние 0,5 Вольта это падение напряжения во вторичной цепи первого выхода, которые скомпенсировал регулятор на первом выходе. Но поставили ДГС который на каждый ампер тока снижает напряжение в другом канале на пол вольта. И теперь напряжения стабильны. Теперь перенесите работу ДГС, на БП без регулятора и его роль становится видна - выравнивать напряжения на выходах, чтоб они не сильно отличались. Для численного примера без него будет под нагрузкой 1 Ампер 9 и 9.5 Вольт соответственно, а с ним 9 и 9 Вольт, - напряжения близки.
    • Guest Сергей
      Что предлагаете? GU 10? Неужели данный цоколь заведомо обречен на горение? от всех прям производителей? Почему лэд лампы с еще меньшим формфактором служат долше? Может проще больше не связыватся с леруамерлен производством? По указанной вами ветке, есть ссылочка кстати на тот самый ламптест, исходя из их совета я и купил LEXMAN леруа мерлен
    • Схему положите, обозначьте что, где и сколько, может кто-нибудь ответит. Нужно давать полную инфу, я писал. Как это понимать, что послужило пищей для такого вывода? Дырка появилась, ножки отвалились, ещё что-нибудь...  если ножки, то какие, что с питанием и тд...
    • https://forum.cxem.net/index.php?/topic/198431-светодиодные-лампы-хорошие-и-плохие/
  • Покупай!

×
×
  • Create New...