久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 18387|回復(fù): 23
打印 上一主題 下一主題
收起左側(cè)

STM32 SPWM的生成方法詳解

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:404281 發(fā)表于 2018-9-30 09:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
文檔描述了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)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:485457 發(fā)表于 2019-3-25 16:08 | 只看該作者
好貼,學(xué)習(xí)了。
回復(fù)

使用道具 舉報

板凳
ID:485457 發(fā)表于 2019-3-25 16:09 | 只看該作者
學(xué)習(xí)中,太有用。
回復(fù)

使用道具 舉報

地板
ID:536159 發(fā)表于 2019-5-12 17:10 | 只看該作者
好貼,好好學(xué)習(xí)
回復(fù)

使用道具 舉報

5#
ID:540446 發(fā)表于 2019-5-17 09:29 | 只看該作者
學(xué)習(xí)了 謝謝
回復(fù)

使用道具 舉報

6#
ID:540446 發(fā)表于 2019-5-17 09:30 | 只看該作者
學(xué)習(xí)了 謝謝
回復(fù)

使用道具 舉報

7#
ID:540718 發(fā)表于 2019-5-17 15:16 | 只看該作者
學(xué)到了!
回復(fù)

使用道具 舉報

8#
ID:511461 發(fā)表于 2019-5-20 19:48 | 只看該作者
好貼,謝謝大佬
回復(fù)

使用道具 舉報

9#
ID:381972 發(fā)表于 2019-6-7 11:38 | 只看該作者
受教了,但是我還是沒有看懂,就是還不懂為什么是128個數(shù)據(jù),而且如皋我要把SPWM的頻率改為20KHZ,應(yīng)該是128*2個數(shù)據(jù)嗎,就是很迷惑,望大佬指教
回復(fù)

使用道具 舉報

10#
ID:355325 發(fā)表于 2019-6-17 18:01 | 只看該作者
好帖,可以學(xué)到嘻嘻嘻
回復(fù)

使用道具 舉報

11#
ID:568628 發(fā)表于 2019-6-21 15:21 來自手機 | 只看該作者
學(xué)習(xí)了,謝謝
回復(fù)

使用道具 舉報

12#
ID:264932 發(fā)表于 2019-6-27 10:03 | 只看該作者
好東西,學(xué)習(xí)了
回復(fù)

使用道具 舉報

13#
ID:458593 發(fā)表于 2019-7-8 11:45 | 只看該作者
正在學(xué)習(xí)中
回復(fù)

使用道具 舉報

14#
ID:423309 發(fā)表于 2019-7-22 02:38 | 只看該作者
這個真的很好
回復(fù)

使用道具 舉報

15#
ID:589843 發(fā)表于 2019-7-24 16:59 | 只看該作者
表里是100個點啊,不是128個
回復(fù)

使用道具 舉報

16#
ID:510578 發(fā)表于 2019-7-28 09:34 | 只看該作者
闊以闊以
回復(fù)

使用道具 舉報

17#
ID:595073 發(fā)表于 2019-8-4 16:53 | 只看該作者
有用,感謝!
回復(fù)

使用道具 舉報

18#
ID:687341 發(fā)表于 2020-1-21 10:11 | 只看該作者
謝謝兄弟
回復(fù)

使用道具 舉報

19#
ID:203971 發(fā)表于 2020-3-17 13:46 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

20#
ID:600982 發(fā)表于 2020-6-11 08:23 | 只看該作者
學(xué)習(xí)中,太有用。
回復(fù)

使用道具 舉報

21#
ID:600982 發(fā)表于 2020-6-22 10:51 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報

22#
ID:338011 發(fā)表于 2021-2-3 22:58 | 只看該作者
學(xué)習(xí)中,太有用
回復(fù)

使用道具 舉報

23#
ID:376366 發(fā)表于 2021-2-5 15:18 | 只看該作者
我想把這個改成生產(chǎn)1K的正弦波,可以嗎?還有就是用16位的單片機可以嗎?
回復(fù)

使用道具 舉報

24#
ID:905785 發(fā)表于 2021-4-17 18:40 | 只看該作者
請問互補輸出是什么意思呢?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲网址在线观看 | 日本精品一区 | 超碰人人人| 亚洲一区二区三区在线观看免费 | 午夜男人天堂 | 国产成人福利视频在线观看 | 国内精品伊人久久久久网站 | 欧美日韩黄 | 日本在线一区二区 | 亚洲精品久久久一区二区三区 | 爱爱视频日本 | 91精品国产91久久久久久吃药 | 国产精品影视在线观看 | 亚洲综合资源 | 久久欧美高清二区三区 | 国产精品视频免费观看 | 激情欧美一区二区三区中文字幕 | 日韩在线一区二区三区 | 精品久久久久久久久久久久久久 | 色婷婷av一区二区三区软件 | 国产精品久久久久久久久久久久久 | 亚洲狠狠| 91成人在线| 狠狠插天天干 | 999精品在线 | 精品99久久久久久 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 天天射天天操天天干 | 久久男人 | 国产91久久久久 | 亚洲精品日日夜夜 | 午夜视频在线观看一区二区 | 午夜精品影院 | 亚洲欧美一区二区三区国产精品 | 久久一二区| 国产精品视频不卡 | 欧美日韩福利视频 | 欧洲av一区 | 久草网址 | 亚洲一区二区电影在线观看 | 国产精品久久久久久久久婷婷 |