2019-08-13 23:29发布
正点原子 发表于 2017-9-20 00:36 SPWM就是控制脉宽按正弦规律变化,就可以出来了,和三角波有什么关系
dossdesmend 发表于 2017-9-20 09:19 难道不是计数器设置成中心对齐模式1 出现的吗
最多设置5个标签!
#include "./tim/bsp_advance_tim.h"
#include "arm_math.h"
#define F_PWM 2000
#define MAX_CNT ((SystemCoreClock / F_PWM) - 1)
#define T 360
uint16_t sin_arr[T];
void TIM1_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOE , ENABLE); /*¿aÆô¶¨ê±Æ÷1Ïà1ØμÄGPIOíaéèê±Öó 1òÔØÔúAHB1×üÏßéÏ GPIOE*/
/* ¶¨ê±Æ÷1|Äüòy½Å3õê¼»ˉ */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOE, &GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE); //ÖØó3éäTIM1òy½Å
/* Ö¸¶¨òy½Å¸′óÃ1|Äü Ç°èy¸öÎaCH1 CH2 CH3oóèy¸öÎaCH1N CH2N CH3N*/
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_TIM1);
}
void TIM1_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//»ù±¾¶¨ê±½á11ìå
TIM_OCInitTypeDef TIM_OCInitStructure; //êä3ö±è½Ï½á11ìå
TIM_BDTRInitTypeDef TIM_BDTRInitStructure; //é23μoíËàÇøÅäÖýá11ìå
//μúò»2½ ÅäÖÃê±Öó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //¶¨ê±Æ÷11òÔØÔúAPB2×üÏßéÏ
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //òy½ÅÖØó3éäòa¿aÆôÕa¸öê±Öó
//μú¶t2½ ¶¨ê±Æ÷»ù±¾ÅäÖÃ
TIM_DeInit(TIM1);
TIM_TimeBaseStructure.TIM_Period = MAX_CNT; //ÖüÆú=£¨ARR+1£©/TIM_CLK=84000/84M=10us f=1Khz
TIM_TimeBaseStructure.TIM_Prescaler = 1; //Tout=((arr+1)*(psc+1))/Tclk;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //2»·ÖÆμ óÃóúéèÖÃËàÇø걼䣿
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_CenterAligned1 ;//ÅäÖÃÎaÖDDĶÔÆëÄ£ê½1
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //Öظ′¼ÆêyÆ÷Îa0 óÃóú×Ô¶ˉ¸üDÂ
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 3õê¼»ˉ¶¨ê±Æ÷
//ÅäÖö¨ê±Æ÷2 êÇÔúÖD¶ÏàïÃæ¸ü¸Ä¶¨ê±Æ÷1μÄÕ¼¿Õ±è ′ó¶øê1¶¨ê±Æ÷12úéúSPWM
TIM_TimeBaseStructure.TIM_Period =3444 ; //
TIM_TimeBaseStructure.TIM_Prescaler =0; //
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //2»·ÖÆμ óÃóúéèÖÃËàÇø걼䣿
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//ÅäÖÃÎaÖDDĶÔÆëÄ£ê½1
TIM_TimeBaseStructure.TIM_RepetitionCounter=0; //Öظ′¼ÆêyÆ÷Îa0 óÃóú×Ô¶ˉ¸üDÂ
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // 3õê¼»ˉ¶¨ê±Æ÷
TIM_ClearFlag(TIM1, TIM_FLAG_Update); // Çå3tòç3öÖD¶Ï±êÖ¾
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); // ¿aÆô¼ÆêyÆ÷ÖD¶Ï
//μúèy2½ PWMêä3öÅäÖÃ
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //ÅäÖÃÎaPWMÄ£ê½1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //êä3öê1Äü
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
TIM_OCInitStructure.TIM_Pulse =0; //éèÖÃÕ¼¿Õ±è ÔúÖD¶Ï·tÎñoˉêyÖD¸øêyÖμ
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //éèÖÃóDD§μçƽÎaμíμçƽ òòÎaPWMÄ£ê½1μÄÔμ1ê
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; //»¥21êä3ö¸ßμçƽóDD§
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; //Ö÷êä3öÔú±»½ûÖ1ê±Îa¸ßμçƽ
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //»¥21êä3öÔú±»½ûÖ1ê±Îaμíμçƽ
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OCInitStructure.TIM_Pulse =0;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //êä3öê1Äü
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
TIM_OC2Init(TIM1, &TIM_OCInitStructure);//ê1Äüí¨μàÖØ×°ÔØ
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //êä3öê1Äü
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21¶Ëêä3öê1Äü
TIM_OCInitStructure.TIM_Pulse =0;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
//μúËÄ2½ ËàÇøoíé23μ1|ÄüÅäÖÃ
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;//ÔËDDÄ£ê½ÏÂêä3öÑ¡Ôñ
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;//¿ÕÏDÄ£ê½ÏÂêä3öÑ¡Ôñ
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;//Ëø¶¨éèÖà 2»ì«¶®
TIM_BDTRInitStructure.TIM_DeadTime = 100;//ËàÇøê±¼ä 11/sysclk168M=0.0654ns
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;//é23μ1|Äüê1Äü
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;//2»ì«¶®
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//×Ô¶ˉêä3öê1Äü
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);//3õê¼»ˉBDTR
//μúÎå2½ ê1Äü¶Ë′ò¿a
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM1, ENABLE);
// ê1Äü¶¨ê±Æ÷
TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM2, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);//MOEÖ÷êä3öê1Äü
}
void init_sin_arr( void )
{
int n;
for(n=0;n<=T;n++)
{
//sin_arr[n] = (uint16_t) ( MAX_CNT * 0.5 * (1.0 + sin( 2 * PI * n / 360) ) + 0.5 );
sin_arr[n] = (uint16_t) ( MAX_CNT * 0.5 * (1.0 + sin( 2 * PI * n / 360) ) );
}
}
void TIM1_CC_IRQHandler(void)
//void TIM2_IRQHandler(void)
{
static int angle=0;
if ( TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET )
{
TIM1->CCR1 = sin_arr[ angle % 360 ] ;// TIMx_CCRn Îa±è½Ï¼Ä′æÆ÷ ÆäêyÖμμèóúTIM_PulseàïÃæμÄÄúèY
TIM1->CCR2 = sin_arr[ (angle + 120 ) % 360 ] ;
TIM1->CCR3 = sin_arr[ (angle + 240 ) % 360 ] ;
angle++;
if ( angle == T ) angle = 0;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
[/mw_shl_code]
难道不是计数器设置成中心对齐模式1 出现的吗
就是这样子 我不知道有没有理解正确
用一个三角波(载波)和正弦波吧(调制波)来生成SPWM
一周热门 更多>