Ярлыки

_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)

суббота, 17 января 2015 г.

3 phase sinusoidal pulse width modulation (PWM) TIM1

#include "stm32f10x.h"

int i=0;

//sinusoidal data for 256 point 
const u16 PWMdata[256]={
2884,2954,3025,3095,3165,3235,3305,3375,3444,3512, 
3581,3648,3715,3782,3848,3914,3978,4042,4105,4168, 
4229,4290,4349,4408,4466,4522,4578,4633,4686,4738, 
4789,4839,4887,4934,4980,5024,5067,5109,5149,5187, 
5224,5260,5294,5326,5357,5387,5414,5440,5465,5487, 
5508,5528,5545,5561,5575,5588,5598,5607,5614,5614, 
5614,5614,5614,5614,5614,5614,5607,5598,5588,5575, 
5561,5545,5528,5508,5487,5465,5440,5414,5387,5357, 
5326,5294,5260,5224,5187,5149,5109,5067,5024,4980, 
4934,4887,4839,4789,4738,4686,4633,4578,4522,4466, 
4408,4349,4290,4229,4168,4105,4042,3978,3914,3848, 
3782,3715,3648,3581,3512,3444,3375,3305,3235,3165, 
3095,3025,2954,2884,2813,2742,2672,2601,2531,2461, 
2391,2321,2251,2182,2114,2045,1978,1911,1844,1778, 
1712,1648,1584,1521,1458,1397,1336,1277,1218,1160, 
1104,1048,993 ,940 ,888 ,837 ,787 ,739 ,692 ,646 , 
602 ,559 ,517 ,477 ,439 ,402 ,366 ,332 ,300 ,269 , 
239 ,212 ,186 ,161 ,139 ,118 ,98 ,81 ,65 ,51 , 
38 ,28 ,19 ,12 ,10 ,10 ,10 ,10 ,10 ,10 , 
12 ,19 ,28 ,38 ,51 ,65 ,81 ,98 ,118 ,139 , 
161 ,186 ,212 ,239 ,269 ,300 ,332 ,366 ,402 ,439 , 
477 ,517 ,559 ,602 ,646 ,692 ,739 ,787 ,837 ,888 , 
940 ,993 ,1048,1104,1160,1218,1277,1336,1397,1458, 
1521,1584,1648,1712,1778,1844,1911,1978,2045,2114, 
2182,2251,2321,2391,2461,2531,2601,2672,2742,2813, 
2884,2954,3025,3095,3165,3235, 
};
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
TIM_OCInitTypeDef TIM_OCInitStructure; 
GPIO_InitTypeDef GPIO_InitStructure; 
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

ErrorStatus HSEStartUpStatus;

/* Private function prototypes -----------------------------------------------*/ 
void RCC_Configuration(void); 
void GPIO_Configuration(void); 
void NVIC_Configuration(void);


int main(void) 

#ifdef DEBUG 
debug(); 
#endif 
/* System Clocks Configuration */ 
RCC_Configuration();

/* NVIC configuration */ 
NVIC_Configuration();

/* GPIO Configuration */ 
GPIO_Configuration();

/* TIM1 Configuration --------------------------------------------------- 
Generates 6 complemantary PWM signals with 4 sinusoidal data duty cycles: 
TIM1CLK = 72 MHz, Prescaler = 0, TIM1 counter clock = 72 MHz 
TIM1 frequency = TIM1CLK/(TIM1_Period + 1) = 
Time Base configuration */

/* TIM1 Peripheral Configuration ----------------------------------------*/ 
/* Time Base configuration */ 
TIM_TimeBaseStructure.TIM_Prescaler = 0; 
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
TIM_TimeBaseStructure.TIM_Period = 5625-1; 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

/* Channel 3 Configuration in PWM mode */ 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
TIM_OCInitStructure.TIM_Pulse = PWMdata[0];//127; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; 
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC3Init(TIM1, &TIM_OCInitStructure);

/* Channel 2 Configuration in PWM mode */ 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
TIM_OCInitStructure.TIM_Pulse = PWMdata[0];//127; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; 
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC2Init(TIM1, &TIM_OCInitStructure);

/* Channel 1 Configuration in PWM mode */ 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; 
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; 
TIM_OCInitStructure.TIM_Pulse = PWMdata[5];//127; 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; 
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

/* Automatic Output enable, Break, dead time and lock configuration*/ 
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; 
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; 
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; 
TIM_BDTRInitStructure.TIM_DeadTime = 5; 
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; 
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; 
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
/* TIM1 counter enable */
//clear tim1 interrupt flag 
TIM_ClearFlag(TIM1, TIM_FLAG_CC1);
//TIM1 interrupt source
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
TIM_Cmd(TIM1, ENABLE);

/* Main Output Enable */ 
TIM_CtrlPWMOutputs(TIM1, ENABLE);
while (1) 
{


}

/******************************************************************************* 
* Function Name : RCC_Configuration 
* Description : Configures the different system clocks. 
* Input : None 
* Output : None 
* Return : None 
*******************************************************************************/
void RCC_Configuration(void) 

/* RCC system reset(for debug purpose) */ 
RCC_DeInit();

/* Enable HSE */ 
RCC_HSEConfig(RCC_HSE_ON);

/* Wait till HSE is ready */ 
HSEStartUpStatus = RCC_WaitForHSEStartUp();

if (HSEStartUpStatus == SUCCESS) 

/* Enable Prefetch Buffer */ 
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/* Flash 2 wait state */ 
FLASH_SetLatency(FLASH_Latency_2);

/* HCLK = SYSCLK */ 
RCC_HCLKConfig(RCC_SYSCLK_Div1);

/* PCLK2 = HCLK */ 
RCC_PCLK2Config(RCC_HCLK_Div1);

/* PCLK1 = HCLK/2 */ 
RCC_PCLK1Config(RCC_HCLK_Div2);

/* ADCCLK = PCLK2/4 */ 
RCC_ADCCLKConfig(RCC_PCLK2_Div6);

/* PLLCLK = 8MHz * 9 = 72 MHz */ 
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

/* Enable PLL */ 
RCC_PLLCmd(ENABLE);

/* Wait till PLL is ready */ 
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) 
{}

/* Select PLL as system clock source */ 
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/* Wait till PLL is used as system clock source */ 
while (RCC_GetSYSCLKSource() != 0x08) 
{} 
}

/* TIM1, GPIOA and GPIOB clock enable */ 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | 
RCC_APB2Periph_GPIOB| 
RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);
}
/******************************************************************************* 
* Function Name : GPIO_Configuration 
* Description : Configure the TIM1 Pins. 
* Input : None 
* Output : None 
* Return : None 
*******************************************************************************/ 
void GPIO_Configuration(void) 

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA Configuration: Channel 1, 2, 3 and 4 as alternate function push-pull */ 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

/* GPIOB Configuration: Channel 1N, 2N and 3N as alternate function push-pull */ 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_6 | GPIO_Pin_7; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
GPIO_Init(GPIOC, &GPIO_InitStructure); 
}

/******************************************************************************* 
* Function Name : NVIC_Configuration 
* Description : Configures Vector Table base location. 
* Input : None 
* Output : None 
* Return : None 
*******************************************************************************/ 
void NVIC_Configuration(void) 

NVIC_InitTypeDef NVIC_InitStructure;

#ifdef VECT_TAB_RAM 
/* Set the Vector Table base location at 0x20000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else /* VECT_TAB_FLASH */ 
/* Set the Vector Table base location at 0x08000000 */ 
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); 
#endif

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; 
//NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; 
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
NVIC_Init(&NVIC_InitStructure);
}
#ifdef DEBUG 
/******************************************************************************* 
* Function Name : assert_failed 
* Description : Reports the name of the source file and the source line number 
* where the assert_param error has occurred. 
* Input : - file: pointer to the source file name 
* - line: assert_param error line source number 
* Output : None 
* Return : None 
*******************************************************************************/ 
void assert_failed(u8* file, u32 line) 

/* User can add his own implementation to report the file name and line number, 
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

while (1) 
{} 

#endif

/******************* *****END OF FILE****/

void TIM1_CC_IRQHandler(void)

i++;
TIM_OCInitStructure.TIM_Pulse = PWMdata[i];
TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
TIM_OC2Init(TIM1, &TIM_OCInitStructure); 
TIM_OC3Init(TIM1, &TIM_OCInitStructure);

/* check if array's index reaches the max: 255 */
if (i == 255)
{
i = 0;
}
TIM_ClearFlag(TIM1,TIM_FLAG_CC1);
}

1 комментарий: