Для питания ряда устройств (например электродвигателей переменного тока) иногда необходимо наличие сдвинутых по фазе питающих напряжений. Для питания 2-х фазных синхронных индукционных двигателей необходимо наличие двух фаз синусоидального напряжения с частотой 400 Герц и сдвинутых по фазе на 90 градусов. Один из примеров таких двигателей являются двигатели серии ДИД. Они интересны тем, что их частота вращения может составлять от 16000 до 18000 об/мин. Для питания таких двигателей и было сделано данное устройство, которое представляет собой задающий генератор 2-х фазного 400 Гц напряжений сдвинутых по фазе на 90 градусов относительно друг друга.
В качестве микроконтроллера использован STM32F030F4. Его выбор обусловлен его "минимализмом" - наименьший из корпусов в серии STM32F0 и естественно с минимальной стоимостью. Схема подключения изображена ниже. Микроконтроллер работает на частоте 48 МГц. В качестве задающего генератора использован TIM3, так как в данном контроллере только этот таймер можно конфигурировать так, чтобы использовать выходы трех каналов. Третий канал можно в случае необходимости использовать для генерации 3-фазного напряжения. Таймер работает в режиме генерации ШИМ (PWM). Для получения синусоидального напряжения 400 Гц в канале используется высокочастотное изменение коэффициента ШИМ с частотой 40 кГц, на которую настроен системный таймер SysTick. Синусоида формируется с помощью таблицы значений синуса с шагом 360/100 градусов.
Ниже показаны выходные осциллограммы генератора
Ниже приводится текст программы.
#include «stm32f0xx.h»
int t1,t2;
const int table[125]={
240,255,270,285,300,314,328,342,
356,369,381,393,404,415,425,434,
443,450,457,463,468,472,476,478,
480,480,480,478,476,472,468,463,
457,450,443,434,425,415,404,393,
381,369,356,342,328,314,300,285,
270,255,240,225,210,195,180,166,
152,138,124,111,99,87,76,65,
55,46,37,30,23,17,12,8,
4,2,0,0,0,2,4,8,
12,17,23,30,37,46,55,65,
76,87,99,111,124,138,152,166,
180,195,210,225,240,
//
240,255,270,285,300,314,328,342,
356,369,381,393,404,415,425,434,
443,450,457,463,468,472,476,478
};
void ConfigureHSE(void)
{
__IO uint32_t StartUpCounter = 0, HSEStatus = 0;
/******************************************************************************/
/* HSE used as System clock source */
/******************************************************************************/
/* SYSCLK, HCLK, PCLK configuration ----------------------------------------*/
/* Enable HSE */
RCC->CR |= RCC_CR_HSEON;
/* Wait till HSE is ready and if Time out is reached exit */
do
{
HSEStatus = RCC->CR & RCC_CR_HSERDY;
StartUpCounter++;
} while((HSEStatus == 0) && (StartUpCounter != 5000));
if ((RCC->CR & RCC_CR_HSERDY) != RESET)
{
HSEStatus = 0x01;
}
else
{
HSEStatus = 0x00;
}
if (HSEStatus == 0x01)
{
/* Enable Prefetch Buffer and set Flash Latency */
FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;
/* HCLK = SYSCLK / 1 */
RCC->CFGR |= RCC_CFGR_HPRE_DIV1;
/* PCLK = HCLK / 1 */
RCC->CFGR |= RCC_CFGR_PPRE_DIV1;
/* Select HSE as system clock source */
// RCC->CFGR &= ~(RCC_CFGR_SW_PLL);
// RCC->CFGR |= RCC_CFGR_SW_HSE;
RCC->CFGR |= RCC_CFGR_SWS_PLL;
RCC->CFGR |= RCC_CFGR_SW_PLL;
/* Wait till HSE is used as system clock source */
// while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSE)
// {
// }
}
else
{ /* If HSE fails to start-up, the application will have wrong clock
configuration. User can add here some code to deal with this error */
}
}
int main(void)
{
ConfigureHSE(); //only for quarz synhro
RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
RCC->AHBENR |= RCC_AHBENR_GPIOAEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER7)) | (GPIO_MODER_MODER7_1);
GPIOA->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER6)) | (GPIO_MODER_MODER6_1);
GPIOB->MODER = (GPIOA->MODER & ~(GPIO_MODER_MODER1)) | (GPIO_MODER_MODER1_1);
GPIOA->AFR[0] |= 0x11000000;
GPIOB->AFR[0] |= 0x00000010;
TIM3->PSC = 0; //APBCLK=48 MHz
TIM3->ARR = 480;
TIM3->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
TIM3->CCMR1 |= TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
TIM3->CCMR2 |= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4PE;
TIM3->CCER |= TIM_CCER_CC1E;
TIM3->CCER |= TIM_CCER_CC2E;
TIM3->CCER |= TIM_CCER_CC4E;
TIM3->BDTR |= TIM_BDTR_MOE;
TIM3->CR1 |= TIM_CR1_CMS_0 | TIM_CR1_CEN;
TIM3->EGR |= TIM_EGR_UG;
SysTick_Config(1200); // 40 kHz
__enable_irq ();
t1=0;
t2=0;
while (1)
{
__WFI();
}
}
///////////////////////////////////////////////////////////////////////////
void SysTick_Handler(void)
{
t1++;
if(t1>=100){t1=0;}
t2++;
if(t2>=100){t2=0;}
TIM3->CCR1=(table[t2+25]);
TIM3->CCR2=(table[t1]);
TIM3->CCR4=table[t1+50];
}
Поправьте код...на изиэлектроникс - правильный, тут - с косяками
ОтветитьУдалитьспасибо, исправил
ОтветитьУдалитьCan you configure to be used on dual phase buck converter ?
ОтветитьУдалить50khz phase shift 180 degree