Ярлыки

_GetPixelIndex (1) _SetPixelIndex (1) 3-phase (1) 800x480 (1) АЦП (1) генератор (1) синхронный усилитель (2) структура (1) учебный курс (1) шаговый двигатель (1) ШИМ (2) accert (1) AD7608 (1) AD8429 (1) ADC (5) amplifer (1) arccos (1) arcsin (1) arctang (2) arctg (3) ARM (2) arm_sqrt_q15 (2) assembler (6) ASSERT (1) atan (2) bit (1) Bitband (1) boot (3) bootlloader (1) BUTTON (1) C (5) C# (1) CAN (2) CC2530 (5) CMSIS (4) command (1) Cordic (1) Core746I (1) CubeMX (4) DBGMCU (2) debug (2) debug.ini (1) delegate (1) Digital Potentiometers (1) DigitalPOT (1) Discovery (1) DMA (9) DMA2D (1) DSP (1) DSP library (1) DWT (1) EFM32 (5) EmWin (9) EXTI (1) FATFS (1) FMC (2) FreeRTOS (2) gl868-dual cmux (1) GPIO (4) GUI (2) GUIBuilder (1) GUIDRV_CompactColor_16 (1) HAL (3) HappyGecko (1) Hard Fault (2) heap (1) I2C (1) ID (1) ILI9320 (1) ILI9325 (1) Initialisation (1) InitLTDC (1) Instrumentithion (1) Interrupt (4) ITR (1) JTAG (1) Keil (5) LCDConf (2) lock-in (1) LTCD (1) LTDC (3) main (1) memory (1) MINI_STM32 Revision 01 (1) nBoot0 (1) NVIC (1) OnePulse (2) OSAL (4) pack (1) phase (1) printf (3) Pulse (1) PWM (12) RCC (2) RCR (1) Register (1) RESET (2) RS232 (3) RSS (1) RTC (3) RTOS-RTX (1) RTT (1) RTX-RTOS (1) SDCard (1) SDRAM (6) Segger (2) SPI (3) sqrt (3) SSD1298 (1) SSD1963 (1) Standart Peripherial Library (3) STANDBAY (1) startup (1) STemWin (8) stepper motor (1) STlink (2) STM32 (17) STM32429ZI (1) STM32Cube (1) STM32DBG.IN (1) STM32F (28) STM32F0 (4) STM32F1 (13) STM32F4 (10) STM32F4 Discovery (1) STM32F407ZG (1) STM32F429 (2) STM32F746 (1) STOP (1) string (1) struct (1) SWD (1) SWD JTAG (1) Synhronization (1) system_stm32f4xx.c (1) SystemInit (1) SysTick (1) task (4) telit (1) TIM (27) typedef (1) UART (1) USART (9) viewer (2) WM_PAINT (1) Z-stack (5) ZigBee (5)

среда, 27 мая 2015 г.

2-x фазный ШИМ (PWM) генератор на STM32F030F4

   Для питания ряда устройств (например электродвигателей переменного тока) иногда необходимо наличие сдвинутых по фазе питающих напряжений. Для питания 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]; 
}

3 комментария:

  1. Поправьте код...на изиэлектроникс - правильный, тут - с косяками

    ОтветитьУдалить
  2. Can you configure to be used on dual phase buck converter ?

    50khz phase shift 180 degree

    ОтветитьУдалить