Цитата(lis22 @ 4.6.2019, 15:48)
Но вариант OlegarX-RUS лучше .
ну вот смотри вот тебе часть кода из моего проекта который инициализирует переферию STM32F051K8T6.
Этот код по сути уже конфигурируют контроллер в аппаратный аналог UC2846 (Даже круче) -
RCC->AHBENR|=RCC_AHBENR_GPIOAEN; //Подаем тактирование на порт A
//=========================================<INIT DAC>========================================
RCC->APB1ENR|=RCC_APB1ENR_DACEN; //Включаем DAC
GPIOA->MODER |= GPIO_MODER_MODER4; //GPIOB4 analog
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR4); //Без поддтяжки
DAC->CR = DAC_CR_EN1; //только DAC все остальные значения по умолчанию
//DAC->DHR12R1 = 4095;
DAC->DHR8R1 = Icurrent_value;
//=========================================<INIT comp>========================================
// здесь настраиваем компаратор и пины связанные с ним!!!
RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN; //Подаём тактирование на SYSCFG и COMP-аратор
//GPIOA->MODER |= GPIO_MODER_MODER1 | GPIO_MODER_MODER3;
COMP->CSR = COMP_CSR_COMP1EN | COMP_CSR_COMP2EN | COMP_CSR_COMP1OUTSEL_0 | COMP_CSR_COMP1OUTSEL_1 | COMP_CSR_COMP2OUTSEL_0 | COMP_CSR_COMP2OUTSEL_1
| COMP_CSR_COMP1INSEL_1 | COMP_CSR_COMP1INSEL_2 | COMP_CSR_COMP2INSEL_0 | COMP_CSR_COMP2INSEL_2;
//Включаем оба компарратора и оба настраиваем на Timer 1 OCrefclear input (чтоб резало таймет 1)
//COMP1 (напряжение) инверсный вход PA0, COMP2 (ток) инверсный вход PA5 (в дальнейшем можно попробовать переключить на PA4 (DAC) изменив регистры)
COMP->CSR |= COMP_CSR_COMP1LOCK | COMP_CSR_COMP2LOCK; // здесь блокируем компараторы от дальней записи ошибочных бит в том числе и при сбое!!! не верняк я сделал эту запись отдельной коммандой.
//=========================================<INIT TIM1>========================================
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
GPIOA->MODER |= GPIO_MODER_MODER8_1 | GPIO_MODER_MODER9_1; //GPIOB4 AF (TIM3_CH1)
GPIOA->MODER &= ~(GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0); //GPIOB4 AF (TIM3_CH1)
GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9); //PP
GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR8_1 | GPIO_OSPEEDR_OSPEEDR9_1);//SPEEd 2MHz
GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR8 | GPIO_PUPDR_PUPDR9); //Без поддтяжки
GPIOA->AFR[1] |= 0x22;
TIM1->PSC = 0;
TIM1->ARR = 480; //частота 50 (100)кГц
TIM1->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M | TIM_CCMR1_OC2CE | TIM_CCMR1_OC1CE;;
TIM1->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E ;//| TIM_CCER_CC1P;
TIM1->BDTR = TIM_BDTR_MOE ;//| TIM_BDTR_AOE | TIM_BDTR_BKP | TIM_BDTR_BKE;
TIM1->CCR1 = 227; //заполнение примерно 47% на канал
TIM1->CCR2 = 253; //заполнение примерно 47% на канал
TIM1->EGR = TIM_EGR_UG;
TIM1->DIER |= TIM_DIER_UIE; // разрешение прерывания по обновлению
TIM1->CR1 = TIM_CR1_CMS | TIM_CR1_CEN | TIM_CR1_URS;
По сути этого избыточного кода достаточно чтоб варить он полностью настраивает переферию в шим контроллер!!!! (нахрен при этом простыни калов и стд перифов) так как эти полузатычки по сути типо облегчают инициализацию периферии) Для меня такой код проще и читабельние, а самое главное минимален, референс мануал в помощь!.
В данном коде меняя значение DAC->DHR12R1 или DAC->DHR8R1 мы меняем порог опорного напряжения токового компаратора для отсечки тока поциклово... , для опорного по напряжению (так как DAC в F051 один, опорное формирую таймером на RC цепочку) Схему готового устройства выкладывал полтора года назад.... Пробуйте!!!!
Код инициализации таймера для опорного по напруги:
RCC->APB1ENR|=RCC_APB1ENR_TIM14EN; //включаем тактирование таймера (опорное для компоратора напряжения)
GPIOA->MODER |= GPIO_MODER_MODER7_1; //GPIOB7 AF (TIM14_CH1)
GPIOA->MODER &= ~GPIO_MODER_MODER7_0; //GPIOB7 AF (TIM14_CH1)
GPIOA->OTYPER &= ~GPIO_OTYPER_OT_7 ; //PP
GPIOA->OSPEEDR &= ~GPIO_OSPEEDR_OSPEEDR7 ;//SPEEd 2MHz
GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR7; //Без поддтяжки
GPIOA->AFR[0] |= 0x40000000; // GPIO7 AF-4 TIM14CH1
TIM14->PSC = 0;
TIM14->ARR = 1000;
TIM14->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 ;//| TIM_CCMR1_OC1CE;
TIM14->CCER = TIM_CCER_CC1E ;
TIM14->BDTR = TIM_BDTR_MOE ;
TIM14->CCR1 = 909; //Icurrent_value; (на выходе интегрирующий цепочки таймера 3-и вольта )
// TIM14->EGR = TIM_EGR_UG;
TIM14->CR1 = TIM_CR1_CEN;
Значением TIM14->CCR1 меняем опорное для компаратора напряжения. (если взять F072 то это нахрен не нужно так как в нём два DAC-а)
Аналогично в 10-15 строчек настраивается какой нибудь свободный таймер для кувыркатора.
А если этот свободный таймер настроить хитро и вызывать по нему в определённые моменты прирывание которое на момент переключения полярности кувыркатора уменьшает DAC->DHR12R1 или DAC->DHR8R1 до определённого значения то мы тем самым получаем сброс тока в момент переключения кувыркатора
А ещё лучше настраиваем DMA и по определённым событиям осуществляем транcфер который обновляет вышеописанные регистры, тем самым вообще не дёргая ядро камушка!
.... Всё!!!!
Дерзайте!!!
P.S. Всё гениальное просто