А что ждать , я прошу тот код что у вас сейчас .
В ответ могу предложить выхлоп синуса на 4 или 3 канала со сдвигом фаз,полностью аппаратный ну совершенно бесплатно.
Re: Нелинейность PWM STM32F103
Добавлено: Вт авг 08, 2017 16:54:34
scorpi_0n
Да какой там код! Пишется несколько строчек по ШИМу, на пин цепляется обычный мультиметр и меняя регистр прямо в среде разработки наблюдаем за выходным напряжением, потом нервно ищется глюкодром в своём начальном коде, уже при полной уверенности в правильности референса и даташита.
Re: Нелинейность PWM STM32F103
Добавлено: Вт авг 08, 2017 17:58:23
Z_h_e
Alex-lab писал(а):Есть такой же второй контроллер, поведение 1 в 1.
Alex-lab писал(а):Это был регистр CCR1.
Я тоже не верю в неисправность периферии, да еще на двух МК.
Re: Нелинейность PWM STM32F103
Добавлено: Вт авг 08, 2017 18:32:45
dosikus
[uquote="dosikus",url="/forum/viewtopic.php?p=3158506#p3158506"]я прошу тот код что у вас сейчас .[/uquote]
"-Жаль... Жаль, что нам так и не удалось послушать начальника транспортного цеха." (с)
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 14:15:09
dosikus
Alex-lab, код то покажешь???
Добавлено after 49 seconds:
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:28:40
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?
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:32:49
dosikus
Alex-lab, а вы правда с Манчестера или это стЁб.
Ок я так понял вам нужна пила на TIM1 канал 2 ?
Какой камень, на какую лапу бум выхлоп делать?
И далее какая разрядность PWM нужна и какая частота самой пилы?
Завтра накидаю вам как НАДО работать .
ЗЫ. Завязывайте вы с аурдуньей...
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:33:29
Мурик
Это что ардуина?
Тогда понятно откуда глюки.
ИМХО в нормальной IDE (хотя бы EmBitz) даже на SPL результат был бы лучше. И могли бы пользоваться отладкой.
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:35:24
dosikus
Мурик, гусары молчать!
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:37:10
Мурик
А вот этого не надо, досикус! Здесь свободный инет.
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:41:05
dosikus
Мурик, ты снова свой огрызок Эмоблиц рекламируешь, пора уже расти .
Кстати что ты там в HID либе наворотил , черт ногу сломит.
Хочешь вменяемый пример и со стороны STM и с PC ?
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:43:22
Мурик
Досикус, EmBitz вполне нормальная IDE. Получше ардуины.
И не нужно указывать что мне делать, иначе могу указать куда нужно идти...
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:44:27
Alex-lab
STM32F103C8T6.
У меня мостовой преобразователь, упаравляемый фазосдвигом. ШИМ1, каналы 1 и 3 работают в одних параметрах постоянно, но фаза канала 1 сдвигается в зависимости от требуемого коэффициента заполнения. Да и проверять не надо, хотя спасибо за предложение, т.к. осциллограф показал, что сигнал с контроллера идёт правильный идет правильный, сдвиг есть (см. график выше), всё линейно.
Какая-то специфическая реакция силовой части. Пробовал увеличить затворные резисторы с 22 до 68 Ом (просто для проверки), реакции нет.
Попрошу модератора перекинуть тему в источники питания.
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:47:16
dosikus
Alex-lab, что проверять? Ваш код можно просто выкинуть и написать с нуля .
Сдвинуть каналы по фазе меж собой вы не сможете ни каким чудом.
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:55:52
Alex-lab
[uquote="dosikus",url="/forum/viewtopic.php?p=3159379#p3159379"]Alex-lab, что проверять? Ваш код можно просто выкинуть и написать с нуля .
Сдвинуть каналы по фазе меж собой вы не сможете ни каким чудом.[/uquote]
Как вы можете написать то, что не возможно никаким чудом?
Если опыта недостаточно, лучше не делать скорополительных заключений.
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 22:59:14
dosikus
Alex-lab, не, верить то вы можете во что угодно.
В виноватых китайцев .
В битые биты CCR.
В то, что у таймера STM32 можно сдвигать каналы меж собой по фазе в режиме PWM.
ЗЫ. На счет опыта - не вам судить о моём опыте, не тот у вас уровень.
А вот ваш уровень вы только что опустили ниже плинтуса своим "кодом", вызвав у Мурика рвотный рефлекс...
Re: Нелинейность PWM STM32F103
Добавлено: Ср авг 09, 2017 23:05:59
Alex-lab
[uquote="dosikus",url="/forum/viewtopic.php?p=3159384#p3159384"]Alex-lab, не, верить то вы можете во что угодно.
В виноватых китайцев .
В битые биты CCR.
В то, что у таймера STM32 можно сдвигать каналы по фазе в режиме PWM.[/uquote]
Ладно, поучу немножко, бесплатно.
Про режим PWM я не упоминал. Таймер работает в обычном режиме upcounting, а выходы прямой и инверсный переключаются toggle при совпадении регистром сравнения. Плюс добавлены ДедТаймы. Понятно, что ширина импульсов отличается от меандра на величину ДедТаймов. Фаза же зависит от величины регистра сравнения, которая определяет момент переключения в пределах одного "зуба" пилы счетного регистра TCNT.
[uquote="Alex-lab",url="/forum/viewtopic.php?p=3159361#p3159361"]Вот главная часть ШИМ+родная инциализация, с помощью которой получен рисунок приведёный выше.[/uquote]
Я дико извиняюсь, но DMA от 103/105/107 имеет всего три типа прерываний, которые включаются этими битами:
TEIE: ошибка передачи.
HTIE: включилась передача старшего буфера, младший можно менять.
TCIE: передача завершена.
После срабатывания необходимо чистить флаги DMA_IFCR.
Ничего похожего в коде не вижу. Как он вообще работает???