初级会员

- 积分
- 106
- 金钱
- 106
- 注册时间
- 2021-3-14
- 在线时间
- 20 小时
|
1金钱
本人用的是原子哥方法 在向上计数方式中 需要相位差180度的两路波,同时要求占空比可调 ! 网上参考了一个博文 把博文中的程序移植下可以用 但是在我的程序中 ch3 ch4的占空比不可调 改变中断中TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z ); ch2p-ch2z 的值 只有相位差变了 但是占空比不会改变 哪个大佬知道什么原因! 我的频率是85KHZ 但是ARR是423 ch3频率也是 85khz 根据ch2p=72000000/Fpwm
这个公式所得的 ch2p=847= 423的两倍 这样的话 TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z ); 得到的CCR大于ARR这样可以吗? 但是我把TIM_SetCompare3(TIM1,capture_ch3+20 ) 加上一个20 这种远小于423的数 占空比还是不变 难受啊 是 TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z ) 如果CCR的值大于ARR就有问题吗?
#include "motor.h"
#include "delay.h"
#include "led.h"
//#include "usart.h"
#define Fsys 72000000ul // system freq 72MHz
#define Fpwm 80000 // PWM freq 85K
#define PWM_DUTY 80 // PWM duty 80%
#define ccr1 0
#define ccr2 300
#define deadtime 0
void ConfigTimer( void )
{
GPIO_InitTypeDef GPIO_InitSturcture;
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE );
//TIM1 ??PWM CH1->PA8 CH2->PA9 CH1N->PB13 CH2N->PB14
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitSturcture );
GPIO_InitSturcture.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14;
GPIO_InitSturcture.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitSturcture.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOB, &GPIO_InitSturcture );
//?????
TIM_TimeBaseInitStructure.TIM_Period = (Fsys/2) / Fpwm;
TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInitStructure.TIM_ClockDivision = 0x00;
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;
TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStructure );
//CH1
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle; // μ±CCR1=CNTê±£¬·-×aOC1REFμÄμçÆ½
TIM_OCInitStructure.TIM_Pulse = ccr1; //μ±CCR1=CNTê±£¬CH1êä3öμçÆ½·-×a
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //êäèë¡¢2¶»ñ¡¢±è½ÏμÄóDD§μçÆ½μļ«DÔÎa¸ß
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //¿aÆôOC*êä3öμ½Ïàó|òy½Å
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //»¥21êä3öê1Äü£¬¿aÆôOC*Nêä3öμ½¶Ôó|μÄòy½Å
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset; //Ôú¿ÕÏD×′ì¬ÎaμíμçÆ½
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; //»¥21í¨μàÔú¿ÕÏD×′ì¬Î»μíμçÆ½
TIM_OC1Init( TIM1, &TIM_OCInitStructure );
//CH2
TIM_OCInitStructure.TIM_Pulse = ccr2; //μ±CCR2=CNTê±£¬CH2êä3öμçÆ½·-×a
TIM_OC2Init( TIM1, &TIM_OCInitStructure );
//ËàÇøéèÖÃ
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; //OSSR:ÔËDDÄ£ê½Ï¡°1رÕ×′쬡±Ñ¡Ôñ
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; //OSSI:¿ÕÏDÄ£ê½Ï¡°1رÕ×′ì¬ Ñ¡Ôñ
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; //??? ?,???1
TIM_BDTRInitStructure.TIM_DeadTime = deadtime; //ËàÇøÑóê±ê±¼ä
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; //½ûÖ1é23μêäèë
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low; //é23μêäè뼫DÔ
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; //×Ô¶ˉêä3öê1Äü
TIM_BDTRConfig( TIM1, &TIM_BDTRInitStructure );
/* CH3 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputState_Disable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC3Init(TIM1,&TIM_OCInitStructure);
/* CH4 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;
TIM_OCInitStructure.TIM_Pulse =((Fsys/2) / Fpwm) ;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //μ±CH3óëCH4μÄÏàλ2î′óóúμèóú180¶èê±,êä3ö¼«DÔòaéèÖÃÎaÏà·′
TIM_OC4Init(TIM1,&TIM_OCInitStructure);
TIM_CtrlPWMOutputs( TIM1, ENABLE );
TIM_OC1PreloadConfig( TIM1, TIM_OCPreload_Enable ); //ÔêDí¶¨ê±Æ÷1¤×÷ê±ÏòARRμÄ»o3åÆ÷D′èëDÂÖ죬챶¨ê±Æ÷í¨1y
TIM_OC2PreloadConfig( TIM1, TIM_OCPreload_Enable ); //èí¼t½øDD¸üDÂCCRxμÄÖμ¿ØÖÆ2¨DÎê±£¬ÏÂò»′θüDÂê¼tê±±»¸üDÂ
TIM_OC3PreloadConfig( TIM1, TIM_OCPreload_Disable ); //2»ÔêDí¶¨ê±Æ÷1¤×÷ê±ÏòARRμÄ»o3åÆ÷D′èëDÂÖ죬챶¨ê±Æ÷í¨1y
TIM_OC4PreloadConfig( TIM1, TIM_OCPreload_Disable ); //èí¼t½øDD¸üDÂCCRxμÄÖμ¿ØÖÆ2¨DÎê±£¬á¢¼′éúD§
TIM_ARRPreloadConfig( TIM1, ENABLE );
// TIM_ClearFlag(TIM1, TIM_FLAG_CC3) ; //ÇåÖD¶Ï£¬òÔÃaò»ÆôóÃÖD¶Ïᢼ′2úéúÖD¶Ï
// TIM_ClearFlag(TIM1, TIM_FLAG_CC4) ; //ÇåÖD¶Ï£¬òÔÃaò»ÆôóÃÖD¶Ïᢼ′2úéúÖD¶Ï
TIM_ITConfig( TIM1,TIM_IT_CC3 |TIM_IT_CC4,ENABLE); //ÔêDí CH3¡¢CH4í¨μàμÄêä3ö±è½ÏÖD¶Ï
TIM_Cmd( TIM1, ENABLE );
/* ÖD¶ÏéèÖÃ */
/* Configure one bit for preemption priority */
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn; //TIM12¶»ñ±è½ÏÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //ÏèÕ¼óÅÏè¼¶2¼¶
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //′óóÅÏè¼¶0¼¶
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //
NVIC_Init(&NVIC_InitStructure); //3õê¼»ˉNVIC
}
void TIM1_CC_IRQHandler(void)
{
u16 ch2p=72000000/Fpwm ;
u16 ch2z=ch2p*PWM_DUTY/100;
u16 capture_ch3=0;
u16 capture_ch4=0;
static u8 ch3flag=0;
static u8 ch4flag=0;
LED0=0;
if (TIM_GetITStatus(TIM1, TIM_IT_CC3) ) // CH3′¥·¢êä3ö±è½ÏÖD¶Ï
{
capture_ch3= TIM_GetCapture3(TIM1);
if(ch3flag)
{
TIM_SetCompare3(TIM1,capture_ch3+ch2p-ch2z );
}
else
{
TIM_SetCompare3(TIM1, capture_ch3+ch2z );
}
ch3flag^=1; //2»¶Ïè¡·′
}
// if (TIM_GetITStatus(TIM1, TIM_IT_CC4) != RESET) // CH4′¥·¢êä3ö±è½ÏÖD¶Ï
// {
// capture_ch4= TIM_GetCapture4(TIM1);
// if(ch4flag)
// {
// TIM_SetCompare4(TIM1, capture_ch4+ch2p-ch2z );
// }
// else
// {
// TIM_SetCompare4(TIM1, capture_ch4+ch2z );
// }
// ch4flag^=1; //2»¶Ïè¡·′
// }
TIM_ClearITPendingBit(TIM1, TIM_IT_CC3|TIM_IT_CC4); //Çå3yCH3¡¢CH4μÄêä3ö±è½ÏÖD¶Ï±ê־λ
}
|
|