文檔描述了SPWM的具體生成方法
關(guān)于定時器部分搞了2,3天,主要是想產(chǎn)生spwm波這一塊,其他的了解了一下而已。
首先我先學(xué)習(xí)了產(chǎn)生pwm這一部分,然后學(xué)習(xí)到產(chǎn)生spwm,網(wǎng)上有一個例程是雙通道產(chǎn)生互補的spwm,然后我又做了修改單通道產(chǎn)生雙極性的spwm波。
首先先上雙通道互補程序:
用的是野火的例程
main函數(shù):
#define CLI() __set_PRIMASK(1)
#define SEI() __set_PRIMASK(0)
int main(void)
{
CLI();
SEI();
TIM34_PWM_Init();
while (1)
{
}
}
bsp_pwm_output.c用戶文件
void TIM3_PWM_Init(void)
{
TIM34_GPIO_Config();
TIM34_Mode_Config();
}
static void TIM34_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3|RCC_APB1Periph_TIM4|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
其中,引腳PA6和PA7的復(fù)用功能就是TIM3的CH1通道,和CH2通道。所以要開啟復(fù)用時鐘。同時要注意,定時器的時鐘不是直接來自APB1或APB2,而是來自于輸入為APB1或APB2的一個倍頻器。使用任何一個外設(shè)都必須打開相應(yīng)的時鐘。這樣的好處就是,如果不使用一個外設(shè)的時候,就把它的時鐘關(guān)掉,從而可以降低系統(tǒng)的功耗,達到節(jié)能,實現(xiàn)低功耗的效果。具體見
游客,如果您要查看本帖隱藏內(nèi)容請回復(fù)
,這里TIM3,4為APB1的2倍頻后,時鐘為72MHZ。
static void TIM34_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
NVIC_Configuration();
TIM_TimeBaseStructure.TIM_Period = 7199;//產(chǎn)生的spwm波的周期為T=1*7200/72M=100us(10KHz)
TIM_TimeBaseStructure.TIM_Prescaler = 0;//設(shè)置預(yù)分頻:不預(yù)分頻,即為72MHz
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//設(shè)置時鐘分頻系數(shù):不分頻(這里用不到)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//不懂什么意思
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化定時器3的基礎(chǔ)數(shù)據(jù)
TIM_DeInit(TIM4); //復(fù)位TIM4定時器,使之進入初始狀態(tài) 其功能為復(fù)位外設(shè)PPP的所有寄存器至缺省值
TIM_TimeBaseStructure.TIM_Period=1; //自動裝載寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler= 3599; //時鐘預(yù)分頻數(shù) 使TIM4_CLK=20KHz
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采樣分頻:TIM4每次定時的時間T=2*3600/72M=100us
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數(shù)模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//初始化定時器4的基礎(chǔ)數(shù)據(jù)
TIM_ClearFlag(TIM4, TIM_FLAG_Update); //清除中斷位
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //允許TIM4中斷
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//配置為PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 開啟oc*輸出到對應(yīng)引腳
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互補輸出使能
TIM_OCInitStructure.TIM_Pulse =50* 7200 / 100;//占空比為50%
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//當定時器計數(shù)值小于CCR1_Val時為高電平(極性為正)
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //使能TIM3的通道1和通道2
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 = 12;
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM3, &TIM_BDTRInitStructure);
TIM_CtrlPWMOutputs(TIM3, ENABLE); //開啟定時器3的PWM模式
TIM_Cmd(TIM3, ENABLE); //使能定時器3
TIM_Cmd(TIM4, ENABLE); //使能定時器3
}
中斷的初始化函數(shù)
static void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
stm32f10x_it.c 中斷路徑處理
void TIM4_IRQHandler(void)•
{
static vu16 sign = 0;
static vu16 Counter_sine=0;
static vu16 Duty_Cycle_sinewavetable[128]={
0x0,0x83,0x105,0x187,0x209,
0x28A,0x30A,0x38A,0x409,0x486,
0x502,0x57D,0x5F7,0x66F,0x6E5,
0x75A,0x7CC,0x83D,0x8AB,0x917,
0x981,0x9E8,0xA4D,0xAAF,0xB0E,
0xB6B,0xBC4,0xC1B,0xC6E,0xCBE,
0xD0B,0xD54,0xD9A,0xDDD,0xE1C,
0xE57,0xE8F,0xEC3,0xEF3,0xF1F,
0xF48,0xF6C,0xF8D,0xFA9,0xFC2,
0xFD6,0xFE6,0xFF3,0xFFB,0xFFF,
0xFFF,0xFFB,0xFF3,0xFE6,0xFD6,
0xFC2,0xFA9,0xF8D,0xF6C,0xF48,
0xF1F,0xEF3,0xEC3,0xE8F,0xE57,
0xE1C,0xDDD,0xD9A,0xD54,0xD0B,
0xCBE,0xC6E,0xC1B,0xBC4,0xB6B,
0xB0E,0xAAF,0xA4D,0x9E8,0x981,
0x917,0x8AB,0x83D,0x7CC,0x75A,
0x6E5,0x66F,0x5F7,0x57D,0x502,
0x486,0x409,0x38A,0x30A,0x28A,
0x209,0x187,0x105,0x83,0x0};
if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) == SET)
{
if(sign == 0)
{
TIM_SetCompare1(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
TIM_SetCompare2(TIM3,0);
Counter_sine++;
if(Counter_sine==100) //
{
Counter_sine=0;
sign = 1;
}
}else{
TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
Counter_sine++;
if(Counter_sine==100)
{
Counter_sine=0;
sign = 0;
}
}
}
TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
}
spwm波產(chǎn)生的原理就是,按正弦規(guī)律改變pwm的波的占空比,濾出的基波的頻率是改變占空比的頻率。
TIM4計時溢出中斷,每中斷一次,在中斷函數(shù)中,改變TIM3的比較寄存器的值,即修改占空比。
TIM4_CLK的中斷頻率是10Khz,又半個周期采樣100個點,即半個周期要改100次占空比,也即1個周期改200次占空比,所以改變占空比的頻率是10KHZ/200=50hz。基波頻率為50hz。注意這個表示只有半個周期的。
中間還有很多不懂的地方,
比如
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互補輸出使能是干什么的?我把它去掉也沒什么變化啊?
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
這兩句也不懂。
TIM_OCInitStructure.TIM_Pulse =50* 7200 / 100;//占空比為50%占空比不是都隨著變化了?為什么還要再設(shè)置一個50%的占空比?
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//當定時器計數(shù)值小于CCR1_Val時為高電平(極性為正)
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
反向端口到底是干嘛用的。。。
還有就是,為什么表里有128個點,但是半個周期采樣100個,當然這樣周期是可以保證50hz,但如果我把100改為127,周期是按照預(yù)想的所變化了,即(10KHZ/256=39.0HZ)但是波形確無法完美互補。。如圖:
這個怎么破?
接下來上雙極性的spwm:
程序部分,就是把死區(qū)給去掉了。
中斷函數(shù)修改了其中的數(shù)組
void TIM4_IRQHandler(void)
{
static vu16 sign = 0;
static vu16 Counter_sine=0;
static vu16 Duty_Cycle_sinewavetable[128]={
3783,3952,4150,4320,4489,4658,4828,4997,5138,5308,
5449,5618,5760,5901,6014,6155,6268,6381,6494,6607,
6691,6776,6861,6917,7002,7058,7087,7143,7171,7171,
7200,7200,7200,7171,7171,7143,7087,7058,7002,6917,
6861,6776,6691,6607,6494,6381,6268,6155,6014,5901,
5760,5618,5449,5308,5138,4997,4828,4658,4489,4320,
4150,3952,3783,3614,3444,3275,3077,2908,2738,2569,
2400,2230,2089,1920,1778,1609,1468,1327,1214,1072,
960,847,734,621,536,451,367,310,225,169,141,84,56,56,
28,28,28,56,56,84,141,169,225,310,367,451,536,621,734,
847,960,1072,1214,1327,1468,1609,1778,1920,2089,2230,
2400,2569,2738,2908,3077,3275,3444,3614
};
if ( TIM_GetITStatus(TIM4 , TIM_IT_Update) == SET)
{
TIM_SetCompare1(TIM3,Duty_Cycle_sinewavetable[Counter_sine]);
Counter_sine++;
if(Counter_sine==128) //?????100??
{
Counter_sine=0;
}
}
TIM_ClearITPendingBit(TIM4 , TIM_FLAG_Update);
}
注意這個數(shù)組是完整的正弦波了;關(guān)于數(shù)字的取得也想分享一下,作為菜鳥表示研究了好久。
因為自動裝載值是7200,所以要以7200作為參考,如3600就是占空比為50%,然后用excel做表。大家不要笑話我哈,網(wǎng)上有正弦波生成表,用于單片機產(chǎn)生正弦波的,一般以256為最大比列,然后我就把生成的值除以256乘以7200得到上述數(shù)組。
注意,想要得到50hz的正弦波,就要使中斷頻率為50Hz*128=6400hz,根據(jù)公式反推 TIM_TimeBaseStructure.TIM_Period,TIM_TimeBaseStructure.TIM_Prescaler的值,也就是72M/(TIM_Period+1)*(TIM_Prescaler+1)=6400,
我就取
TIM_TimeBaseStructure.TIM_Period=4;
TIM_TimeBaseStructure.TIM_Prescaler= 2249;
好了,差不多就這樣了。。。只是想把學(xué)到的寫下來,要不然又忘了。。。
STM32學(xué)習(xí)筆記(六)----TIM (待補充)
1、使能TIM時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE);
2、基礎(chǔ)設(shè)置
TIM_TimeBaseStructure.TIM_Period 計數(shù)值
TIM_TimeBaseStructure.TIM_Prescaler 預(yù)分頻,此值+1為分頻的除數(shù)
TIM_TimeBaseStructure.TIM_ClockDivision = 0 時鐘因子 待做進一步說明
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0 待做進一步說明
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up 向上計數(shù)
TIM_CounterMode_Dowm 向下計數(shù)
TIM_CounterMode_CenterAligned1 中心對齊方式1
TIM_CounterMode_CenterAligned2 中心對齊方式2
TIM_CounterMode_CenterAligned3 中心對齊方式3
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
3、通道設(shè)置
----------------------------------------------------------------------------------------------
輸出比較 & PWM通道
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing 輸出比較時間模式 (輸出引腳凍結(jié)無效)
TIM_OCMode_Active 輸出比較主動模式 (匹配時設(shè)置輸出引腳為有效電平,當計數(shù)值為比較/捕獲寄存器值相同時,強制輸出為高電平)
TIM_OCMode_Inactive; 輸出比較非主動模式 (匹配時設(shè)置輸出引腳為無效電平,當計數(shù)值為比較/捕獲寄存器值相同時,強制輸出為低電平)
TIM_OCMode_Toggle 輸出比較觸發(fā)模式 (翻轉(zhuǎn)。當計數(shù)值與比較/捕獲寄存器值相同時,翻轉(zhuǎn)輸出引腳的電平)
TIM_OCMode_PWM1 向上計數(shù)時,當TIMx_CNT < TIMx_CCR*時,輸出電平有效,否則為無效
向下計數(shù)時,當TIMx_CNT > TIMx_CCR*時,輸出電平無效,否則為有效
TIM_OCMode_PWM2 與PWM1模式相反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable 禁止OC*輸出
TIM_OutputState_Enable 開啟OC*輸出到對應(yīng)引腳
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable 互補輸出使能。關(guān)閉OC*N輸出
TIM_OutputNState_Enable 互補輸出使能。開啟OC*N輸出到對應(yīng)的引腳
TIM_OCInitStructure.TIM_Pulse 比較/PWM 通道的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 極性為正
TIM_OCPolarity_Low 極必為負
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High; 極性為正
TIM_OCNPolarity_Low 極必為負
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set 當MOE=0時,如果實現(xiàn)了OC*N,則死區(qū)后OC*=1
TIM_OCIdleState_Reset 當MOE=0時,如果實現(xiàn)了OC*N,則死區(qū)后OC*=0
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleNState_Set 當MOE=0時,死區(qū)后OC*N=1
TIM_OCIdleNState_Reset 當MOE=0時,死區(qū)后OC*N=0
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); 禁止OC1重裝載,即TIM*_CCR*的數(shù)一經(jīng)寫入立即生效,否則要在下一個更新事件到來后才被裝入寄存器
TIM_CtrlPWMOutputs(TIM1,ENABLE); 如果使用PWM模式,則此句一定不能省
-----------------------------------------------------------------------------------------
輸入捕獲通道
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1
TIM_Channel_2
TIM_Channel_3
TIM_Channel_4
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising 輸入/捕獲上升沿有效
TIM_ICPolarity_Falling 輸入/捕獲下降沿有效
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI IC*輸入引腳選擇,針對IC1/IC2有不同的定義
TIM_ICSelection_IndirectTI
TIM_ICSelection_TRC
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1 輸入模式下,捕獲端口上的每一次邊沿都觸發(fā)一次捕獲
TIM_ICPSC_DIV2 輸入模式下,每2次事件觸發(fā)一次捕獲
TIM_ICPSC_DIV4 輸入模式下,每4次事件觸發(fā)一次捕獲
TIM_ICPSC_DIV8 輸入模式下,每8次事件觸發(fā)一次捕獲
TIM_ICInitStructure.TIM_ICFilter = 捕獲采樣頻率,詳見TIM*_CCMR->IC*F說明
----------------------------------------------------------------------------------------------
死區(qū)設(shè)置
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable
TIM_OSSRState_Disable
TIM_BDTRInitStructure.TIM_OSSRIState = TIM_OSSRIState_Enable
TIM_OSSRIState_Disable
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF
TIM_LOCKLevel_1
TIM_LOCKLevel_2
TIM_LOCKLevel_3
TIM_BDTRInitStructure.TIM_DeadTime = 這里調(diào)整死區(qū)大小0-0xff
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable
TIM_Break_Disable
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low
TIM_BreakPolarity_High
TIM_BDTRInitStructure.TIM_AutomaticOutput= TIM_AutomaticOutput_Enable
TIM_AutomaticOutPut_Disable
4、配置中斷
5、開啟TIM
----------------------------------------------------------------------------------------------------
例:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
u16 CCR1_Val = 60000;
u16 CCR2_Val = 40000;
u16 CCR3_Val = 20000;
u16 CCR4_Val = 10000;
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* 基礎(chǔ)設(shè)置*/
TIM_TimeBaseStructure.TIM_Period = 65535; //計數(shù)值
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1; //預(yù)分頻,此值+1為分頻的除數(shù)
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上計數(shù)
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* 比較通道1*/
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //輸出比較非主動模式
TIM_OCInitStructure.TIM_Pulse = CCR1_Val;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //極性為正
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable); //禁止OC1重裝載,其實可以省掉這句,因為默認是4路都不重裝的.
/*比較通道2 */
TIM_OCInitStructure.TIM_Pulse = CCR2_Val;
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
/* 比較通道3 */
TIM_OCInitStructure.TIM_Pulse = CCR3_Val;
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
/* 比較通道4 */
TIM_OCInitStructure.TIM_Pulse = CCR4_Val;
TIM_OC4Init(TIM2, &TIM_OCInitStructure);
TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Disable);
/*使能預(yù)裝載*/
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*預(yù)先清除所有中斷位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update);
/* 4個通道和溢出都配置中斷*/
TIM_ITConfig(TIM2, TIM_IT_CC1 | TIM_IT_CC2 | TIM_IT_CC3 | TIM_IT_CC4|TIM_IT_Update, ENABLE);
/* 允許TIM2開始計數(shù) */
TIM_Cmd(TIM2, ENABLE);
使用中央對齊模式的提示:
● 進入中央對齊模式時,使用當前的向上/向下計數(shù)配置;這就意味著計數(shù)器向上還是向下計數(shù)取決于TIMx_CR1寄存器中DIR位的當前值。此外,軟件不能同時修改DIR和CMS位。
● 不推薦當運行在中央對齊模式時改寫計數(shù)器,因為這會產(chǎn)生不可預(yù)知的結(jié)果。特別地: ─ 如果寫入計數(shù)器的值大于自動重加載的值(TIMx_CNT>TIMx_ARR),則方向不會被更新。例如,如果計數(shù)器正在向上計數(shù),它就會繼續(xù)向上計數(shù)。 ─ 如果將0或者TIMx_ARR的值寫入計數(shù)器,方向被更新,但不產(chǎn)生更新事件UEV。
使用中央對齊模式最保險的方法,就是在啟動計數(shù)器之前產(chǎn)生一個軟件更新(設(shè)置TIMx_EGR位中的UG位),并且不要在計數(shù)進行過程中修改計數(shù)器的值。
互補輸出和死區(qū)插入高級控制定時器(TIM1和TIM8)能夠輸出兩路互補信號,并且能夠管理輸出的瞬時關(guān)斷和接通。 這段時間通常被稱為死區(qū),用戶應(yīng)該根據(jù)連接的輸出器件和它們的特性(電平轉(zhuǎn)換的延時、電源開關(guān)的延時等)來調(diào)整死區(qū)時間。
配置TIMx_CCER寄存器中的CCxP和CCxNP位,可以為每一個輸出獨立地選擇極性(主輸出OCx或互補輸出OCxN)。
互補信號OCx和OCxN通過下列控制位的組合進行控制:TIMx_CCER寄存器的CCxE和CCxNE位,TIMx_BDTR和TIMx_CR2寄存器中的MOE、OISx、OISxN、OSSI和OSSR位,詳見表75帶剎車功能的互補輸出通道OCx和OCxN的控制位。特別的是,在轉(zhuǎn)換到IDLE狀態(tài)時(MOE下降到0)死區(qū)被激活。 同時設(shè)置CCxE和CCxNE位將插入死區(qū),如果存在剎車電路,則還要設(shè)置MOE位。每一個通道都有一個10位的死區(qū)發(fā)生器。參考信號OCxREF可以產(chǎn)生2路輸出OCx和OCxN。
如果OCx和OCxN為高有效:
● OCx輸出信號與參考信號相同,只是它的上升沿相對于參考信號的上升沿有一個延遲。
● OCxN輸出信號與參考信號相反,只是它的上升沿相對于參考信號的下降沿有一個延遲。 如果延遲大于當前有效的輸出寬度(OCx或者OCxN),則不會產(chǎn)生相應(yīng)的脈沖。 下列幾張圖顯示了死區(qū)發(fā)生器的輸出信號和當前參考信號OCxREF之間的關(guān)系。(假設(shè)CCxP=0、CCxNP=0、MOE=1、CCxE=1并且CCxNE=1)
以上文字的Word格式文檔下載(內(nèi)容和本網(wǎng)頁上的一模一樣,方便大家保存):
SPWM的產(chǎn)生.doc
(70 KB, 下載次數(shù): 298)
2018-9-30 09:47 上傳
點擊文件名下載附件
SPWM 下載積分: 黑幣 -5
|