Нелинейность PWM STM32F103

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

А что ждать , я прошу тот код что у вас сейчас .
В ответ могу предложить выхлоп синуса на 4 или 3 канала со сдвигом фаз,полностью аппаратный ну совершенно бесплатно. :)))
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 616
Зарегистрирован: Вс ноя 01, 2015 13:13:49

Сообщение scorpi_0n »

Да какой там код! Пишется несколько строчек по ШИМу, на пин цепляется обычный мультиметр и меняя регистр прямо в среде разработки наблюдаем за выходным напряжением, потом нервно ищется глюкодром в своём начальном коде, уже при полной уверенности в правильности референса и даташита.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Alex-lab писал(а):Есть такой же второй контроллер, поведение 1 в 1.
Alex-lab писал(а):Это был регистр CCR1.
Я тоже не верю в неисправность периферии, да еще на двух МК.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="dosikus",url="/forum/viewtopic.php?p=3158506#p3158506"]я прошу тот код что у вас сейчас .[/uquote]

"-Жаль... Жаль, что нам так и не удалось послушать начальника транспортного цеха." (с)
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Alex-lab, код то покажешь???



Добавлено after 49 seconds:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер

Сообщение Alex-lab »

[uquote="dosikus",url="/forum/viewtopic.php?p=3158506#p3158506"]А что ждать , я прошу тот код что у вас сейчас .
В ответ могу предложить выхлоп синуса на 4 или 3 канала со сдвигом фаз,полностью аппаратный ну совершенно бесплатно. :)))[/uquote]

Спасибо, конечно, за предложение, пока не нужно синусов. Вот если бы пила была, то имело бы смысл, а в синусе сложно рассмотреть отклонения от идеальности. Может это и не синус вовсе...

Но это лирика, а теперь к сути.

На рисунке опять теже почти ступеньки, только начиная с 4 до 1024. Максимум ШИМ стоит на 1120. Захватывает почти весь интервал.
Включено через лампочку, поэтому спадает напряжение.
Изображение

не было времени выкорчевать нужную часть кода из всего проекта.

Вот главная часть ШИМ+родная инциализация, с помощью которой получен рисунок приведёный выше. В исходной программе была обработка данных с АЦП, тут я вцелом сохранил структуру, просто упростив всю обработку до минимума. Значение ШИМ обновляется в обработчике прерывания ДМА.

Код: Выделить всё

#include "dma.h"
#include "timer.h"

#define ADC1_DR 0x4001244C   //ADC onvertion result register address
#define DMA1_BASE_IFCR ((volatile uint32_t *)0x40020004)
#define DMA1_BASE_CCR1 ((volatile uint32_t *)0x40020008)
#define DMA1_BASE_CNDTR1 ((volatile uint32_t *)0x4002000C)
#define DMA1_BASE_CPAR1 ((volatile uint32_t *)0x40020010)
#define DMA1_BASE_CMAR1 ((volatile uint32_t *)0x40020014)
#define NVIC_ISER0 ((volatile uint32_t *) 0xE000E100)

const uint16_t StepDuration = 31250;      //1 sec
const uint8_t StepNumber = 10;
const uint32_t PWMoff = 0xC000;
const uint32_t PWMon = 0xC000;
const uint32_t Pol1 = 0x0030;         //positive
const uint32_t Pol0 = 0x0338;         //opened

boolean b_stoped=true;
uint32_t u32_ADCres[4];               //ADC convertion results 12 bit
uint32_t u32_ADCaddr;                 //Address of ADC results ADC_DR register
uint16_t u16_cnt;
uint16_t u16_step;

uint16_t u16_output[StepNumber] = {4, 8, 16, 32, 64, 128, 256, 512, 1024,0};

void Timer1_CC2 () {
  ADC1->regs->CR2 |= 0x00400000;                  //SOFTware start of ADC convertion
  TIMER1_BASE->SR = 0;
}


void DMA1_channel1_Handler () {                             //happens when DMA obtained data from ADC
  uint16_t tmp;
  if (u16_cnt > StepDuration) {                             //If counter higher than length of a step
    u16_step++;                                             //switch to the next one
    if (u16_step >= StepNumber) u16_step = 0;                //If counter of steps higher than total step number
    tmp = u16_output[u16_step];
    TIMER1_BASE->CCR1 = tmp;
    u16_cnt = 0;
  }
  u16_cnt++;
}

void setup() {
  nvic_init(0x08000000, 0);
  dma_attach_interrupt(DMA1, DMA_CH1, DMA1_channel1_Handler);
  timer_attach_interrupt(TIMER1, TIMER_UPDATE_INTERRUPT, Timer1_CC2);
  nvic_globalirq_enable();
  afio_cfg_debug_ports(AFIO_DEBUG_NONE);        //Debugger disable, its pins to GPIO
  afio_remap(AFIO_REMAP_USART1);
  //  Serial.begin(115200);                     //High transmition rate for diag data sending
  Serial.begin(9600);                           //Low transmission rate for 4 byte train

  RCC_BASE->APB2ENR |= 0x00000200;              //ADC clock enable
  ADC1->regs->CR1 |= 0x00000100;                //Sequence mode + //EndOfConv interrupt enable (+20)
  ADC1->regs->CR2 |= 0x000E0101;                //Trigggered by Softwarestart, DMA reqest enabled, ON
  ADC1->regs->SQR3 |= 0x00018820;               //Channels 1-4 in series
  ADC1->regs->SQR1 |= 0x00300000;               //Sequence length 1

  RCC_BASE->APB2ENR |= 0x00000800;              //PWM clock enable
  TIMER1_BASE->ARR = 1152;                      //Max value of counter 31.25kHz output
  TIMER1_BASE->CR2 = 0x0;                       //
  TIMER1_BASE->CCMR1 = 0x3838;                  //CH1 high out on upconting, low out downcounting, preloading
  TIMER1_BASE->CCMR2 = 0x0038;                  //CH3 high out on upconting, low out downcounting, preloading
  TIMER1_BASE->CCER = 0x0555;                   //CH1,3 output, CH2 - no output
  TIMER1_BASE->PSC = 0;                         //Prescaler=1
  TIMER1_BASE->BDTR = 0x0C24;                   //Dead time 18 tics, auto output, uotputs disconnected
  TIMER1_BASE->CCR1 = 1;                        //VAR. PWM width changeable value
  TIMER1_BASE->CCR2 = 100;                      //Start ADC signal
  TIMER1_BASE->CCR3 = 1;                        //CONST.
  TIMER1_BASE->EGR = 0x0004;                    //Enable CC2 event for ADC convertion.
  TIMER1_BASE->DIER |= 0x003F;                  //CC2, UEV interrupts enabled
  TIMER1_BASE->RCR = 1;                         //Only each second (1+1) event causes interruption 0.5sec
  //  TIMER1_BASE->BDTR |= 0x3000;              //Enable break function, active - high level
  TIMER1_BASE->CR1 = 0x0080;                    //autoreload preload, edge alighed, run disabled

  RCC_BASE->APB2ENR |= 0x00000001;              //Alternate function clock enable
  RCC_BASE->APB2ENR |= 0x00000004;              //GPIOA clock enable
  RCC_BASE->APB2ENR |= 0x00000008;              //GPIOB clock enable
  GPIOA->regs->CRH = 0xBBBBBBBB;                //High A port alternative output with push-pull, 50 MHz
  GPIOA->regs->CRL = 0x00000000;                //Low A port analog inputs
  GPIOB->regs->CRH = 0xBBBBBB33;                //High B port (10-15) alternative output with push-pull, 50 MHz; 8,9 - output pushpull
  GPIOB->regs->CRL = 0x4B333434;                //Low B port (3-5)general porpose output with push-pull, 50 MHz; 1-3 - inout; 6,7 - USART1
  GPIOB->regs->BRR = 0x0000033C;                //Set B general outputs to low state

  RCC_BASE->AHBENR |= 0x0001;                   //Enable DMA clock
  u32_ADCaddr = uint32_t (u32_ADCres);
  *DMA1_BASE_CMAR1 = u32_ADCaddr;               //Startin address of ADC convertion results array
  *DMA1_BASE_CPAR1 = ADC1_DR;                   //Address of ADC data register
  *DMA1_BASE_CNDTR1 = 0x0004;                   //4 bytes to be moved
  *DMA1_BASE_CCR1 = 0b0000101010100011;         //MSIZE, PSIZE 32 bits each, mem inc, TCIE complite interrupt, enable DMA

  pinMode(PC13, OUTPUT);                        //ON-OFF LED
  digitalWrite(PC13, HIGH);                     //Default off state of the LED
  pinMode(PB0, INPUT);                          //ON-OFF switch

  //Starting

}

void loop() {
  boolean b_state = !digitalRead(PB0);

  if ((b_state) && (b_stoped)) {                    //ON switch
    digitalWrite(PC13, LOW);
    delay(500);
    u16_cnt   = 0;                                  //reset main cntr
    b_stoped  = false;                              //disable STOP flag
      GPIOB->regs->BSRR = Pol1;
    delayMicroseconds(32);                   //one periods delay      
    DMA1->regs->IFCR = 0xFFFF;                      //reset DMA interrupt flag
    TIMER1_BASE->SR = 0;                            //reset TIMER1 interrupt flag
    TIMER1_BASE-> CR1 |= 0x0001;                    //Enable ON counter
    TIMER1_BASE->BDTR |= PWMon;
  }

  if ((!b_state) && (!b_stoped)) {                  //OFF Switch
    digitalWrite(PC13, HIGH);
    delay(100);
    b_stoped = true;
    TIMER1_BASE->BDTR &= ~PWMoff;                   //OFF PWM outputs
    TIMER1_BASE-> CR1 &= ~0x0001;                   //Disable OFF counter
    delayMicroseconds(32);                   //one periods delay
      GPIOB->regs->BRR = Pol0;                      //OFF polarity
  }
}
Добавлено after 7 minutes 40 seconds:
Но это еще не все...

Не поленился, замерил сдвиг фазы на каждой ступеньке осциллографом.
Изображение

Вот такие вот пироги с котятами...

Добавлено after 9 minutes 53 seconds:
Да, похоже дело не в регистре. Зря клеветал.
Уменьшил все значения на 1?
Изображение
При решение наиболее сложных задач, большинство, как правило, ошибается...
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Alex-lab, а вы правда с Манчестера или это стЁб.

Ок я так понял вам нужна пила на TIM1 канал 2 ?
Какой камень, на какую лапу бум выхлоп делать?

И далее какая разрядность PWM нужна и какая частота самой пилы?

Завтра накидаю вам как НАДО работать .
ЗЫ. Завязывайте вы с аурдуньей...
Последний раз редактировалось dosikus Ср авг 09, 2017 22:35:49, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Это что ардуина? :shock:
Тогда понятно откуда глюки. :dont_know:

ИМХО в нормальной IDE (хотя бы EmBitz) даже на SPL результат был бы лучше. И могли бы пользоваться отладкой.
Последний раз редактировалось Мурик Ср авг 09, 2017 22:36:27, всего редактировалось 2 раза.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Мурик, гусары молчать! :)))
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

А вот этого не надо, досикус! Здесь свободный инет. :)
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Мурик, ты снова свой огрызок Эмоблиц рекламируешь, пора уже расти .
Кстати что ты там в HID либе наворотил , черт ногу сломит.
Хочешь вменяемый пример и со стороны STM и с PC ?
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Досикус, EmBitz вполне нормальная IDE. Получше ардуины.
И не нужно указывать что мне делать, иначе могу указать куда нужно идти...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер

Сообщение Alex-lab »

STM32F103C8T6.

У меня мостовой преобразователь, упаравляемый фазосдвигом. ШИМ1, каналы 1 и 3 работают в одних параметрах постоянно, но фаза канала 1 сдвигается в зависимости от требуемого коэффициента заполнения. Да и проверять не надо, хотя спасибо за предложение, т.к. осциллограф показал, что сигнал с контроллера идёт правильный идет правильный, сдвиг есть (см. график выше), всё линейно.

Какая-то специфическая реакция силовой части. Пробовал увеличить затворные резисторы с 22 до 68 Ом (просто для проверки), реакции нет.

Попрошу модератора перекинуть тему в источники питания.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Alex-lab, что проверять? Ваш код можно просто выкинуть и написать с нуля .
Сдвинуть каналы по фазе меж собой вы не сможете ни каким чудом.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер

Сообщение Alex-lab »

[uquote="dosikus",url="/forum/viewtopic.php?p=3159379#p3159379"]Alex-lab, что проверять? Ваш код можно просто выкинуть и написать с нуля .
Сдвинуть каналы по фазе меж собой вы не сможете ни каким чудом.[/uquote]

Как вы можете написать то, что не возможно никаким чудом? :facepalm: :facepalm: :facepalm:

Если опыта недостаточно, лучше не делать скорополительных заключений.
Последний раз редактировалось AlekseyEnergo Чт авг 10, 2017 11:57:12, всего редактировалось 1 раз.
Причина: Нарушение п2.7 правил форума. Предупрежден.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Alex-lab, не, верить то вы можете во что угодно.
В виноватых китайцев .
В битые биты CCR.
В то, что у таймера STM32 можно сдвигать каналы меж собой по фазе в режиме PWM.

ЗЫ. На счет опыта - не вам судить о моём опыте, не тот у вас уровень.
А вот ваш уровень вы только что опустили ниже плинтуса своим "кодом", вызвав у Мурика рвотный рефлекс... :)))
Последний раз редактировалось dosikus Ср авг 09, 2017 23:06:14, всего редактировалось 1 раз.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер

Сообщение Alex-lab »

[uquote="dosikus",url="/forum/viewtopic.php?p=3159384#p3159384"]Alex-lab, не, верить то вы можете во что угодно.
В виноватых китайцев .
В битые биты CCR.
В то, что у таймера STM32 можно сдвигать каналы по фазе в режиме PWM.[/uquote]

Ладно, поучу немножко, бесплатно.

Про режим PWM я не упоминал. Таймер работает в обычном режиме upcounting, а выходы прямой и инверсный переключаются toggle при совпадении регистром сравнения. Плюс добавлены ДедТаймы. Понятно, что ширина импульсов отличается от меандра на величину ДедТаймов. Фаза же зависит от величины регистра сравнения, которая определяет момент переключения в пределах одного "зуба" пилы счетного регистра TCNT.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="Alex-lab",url="/forum/viewtopic.php?p=3159378#p3159378"]упаравляемый фазосдвигом. ШИМ1,.[/uquote]

Это ваши слова или мои ?

И поучите лучше жену Щи варить.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 308
Зарегистрирован: Ср ноя 20, 2013 11:29:26
Откуда: Манчестер

Сообщение Alex-lab »

Ладно, не вижу смысла продолжать.
При решение наиболее сложных задач, большинство, как правило, ошибается...
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17

Сообщение AVI-crak »

[uquote="Alex-lab",url="/forum/viewtopic.php?p=3159361#p3159361"]Вот главная часть ШИМ+родная инциализация, с помощью которой получен рисунок приведёный выше.[/uquote]
Я дико извиняюсь, но DMA от 103/105/107 имеет всего три типа прерываний, которые включаются этими битами:
TEIE: ошибка передачи.
HTIE: включилась передача старшего буфера, младший можно менять.
TCIE: передача завершена.
После срабатывания необходимо чистить флаги DMA_IFCR.
Ничего похожего в коде не вижу. Как он вообще работает???
Контактная информация:
Ответить

Вернуться в «Питание»