找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 16750|回复: 23
打印 上一主题 下一主题
收起左侧

STM32 SPWM的生成方法详解

  [复制链接]
跳转到指定楼层
楼主
ID:404281 发表于 2018-9-30 09:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
文档描述了SPWM的具体生成方法

关于定时器部分搞了2,3天,主要是想产生spwm波这一块,其他的了解了一下而已。
首先我先学习了产生pwm这一部分,然后学习到产生spwm,网上有一个例程是双通道产生互补的spwm,然后我又做了修改单通道产生双极性的spwm波。
首先先上双通道互补程序:


用的是野火的例程
main函数:
#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;      // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
其中,引脚PA6和PA7的复用功能就是TIM3的CH1通道,和CH2通道。所以要开启复用时钟。同时要注意,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。使用任何一个外设都必须打开相应的时钟。这样的好处就是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。具体见
游客,如果您要查看本帖隐藏内容请回复
,这里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;//产生的spwm波的周期为T=1*7200/72M=100us(10KHz)
        TIM_TimeBaseStructure.TIM_Prescaler = 0;//设置预分频:不预分频,即为72MHz
         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//设置时钟分频系数:不分频(这里用不到)
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;     //向上计数模式
         TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//不懂什么意思
         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);//初始化定时器3的基础数据

         TIM_DeInit(TIM4);   //复位TIM4定时器,使之进入初始状态   其功能为复位外设PPP的所有寄存器至缺省值         
         TIM_TimeBaseStructure.TIM_Period=1;  //自动装载寄存器的值
         TIM_TimeBaseStructure.TIM_Prescaler= 3599;   //时钟预分频数 使TIM4_CLK=20KHz
         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//采样分频:TIM4每次定时的时间T=2*3600/72M=100us
         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
         TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//初始化定时器4的基础数据

         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*输出到对应引脚
         TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能
         TIM_OCInitStructure.TIM_Pulse =50* 7200 / 100;//占空比为50%
         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于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

}
中断的初始化函数
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波产生的原理就是,按正弦规律改变pwm的波的占空比,滤出的基波的频率是改变占空比的频率。
TIM4计时溢出中断,每中断一次,在中断函数中,改变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%占空比不是都随着变化了?为什么还要再设置一个50%的占空比?
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平(极性为正)
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
反向端口到底是干嘛用的。。。
还有就是,为什么表里有128个点,但是半个周期采样100个,当然这样周期是可以保证50hz,但如果我把100改为127,周期是按照预想的所变化了,即(10KHZ/256=39.0HZ)但是波形确无法完美互补。。如图:


这个怎么破?


接下来上双极性的spwm:


程序部分,就是把死区给去掉了。
中断函数修改了其中的数组
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);
}
注意这个数组是完整的正弦波了;关于数字的取得也想分享一下,作为菜鸟表示研究了好久。
因为自动装载值是7200,所以要以7200作为参考,如3600就是占空比为50%,然后用excel做表。大家不要笑话我哈,网上有正弦波生成表,用于单片机产生正弦波的,一般以256为最大比列,然后我就把生成的值除以256乘以7200得到上述数组。
注意,想要得到50hz的正弦波,就要使中断频率为50Hz*128=6400hz,根据公式反推 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;
好了,差不多就这样了。。。只是想把学到的写下来,要不然又忘了。。。


STM32学习笔记(六)----TIM (待补充)
1、使能TIM时钟
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM*,ENABLE);
2、基础设置
   TIM_TimeBaseStructure.TIM_Period                                                 计数值  
   TIM_TimeBaseStructure.TIM_Prescaler                                              预分频,此值+1为分频的除数
   TIM_TimeBaseStructure.TIM_ClockDivision      =   0                               时钟因子 待做进一步说明
   TIM_TimeBaseStructure.TIM_RepetitionCounter =   0                               待做进一步说明
   TIM_TimeBaseStructure.TIM_CounterMode        =   TIM_CounterMode_Up              向上计数
                                                    TIM_CounterMode_Dowm            向下计数
                                                    TIM_CounterMode_CenterAligned1 中心对齐方式1
                                                    TIM_CounterMode_CenterAligned2 中心对齐方式2
                                                    TIM_CounterMode_CenterAligned3 中心对齐方式3
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  
3、通道设置
    ----------------------------------------------------------------------------------------------
    输出比较 & PWM通道
    TIM_OCInitStructure.TIM_OCMode =           TIM_OCMode_Timing                   输出比较时间模式    (输出引脚冻结无效)
                                                TIM_OCMode_Active                   输出比较主动模式    (匹配时设置输出引脚为有效电平,当计数值为比较/捕获寄存器值相同时,强制输出为高电平)                                               
                                                TIM_OCMode_Inactive;            输出比较非主动模式 (匹配时设置输出引脚为无效电平,当计数值为比较/捕获寄存器值相同时,强制输出为低电平)     
                                                TIM_OCMode_Toggle                   输出比较触发模式    (翻转。当计数值与比较/捕获寄存器值相同时,翻转输出引脚的电平)
                                                TIM_OCMode_PWM1                     向上计数时,当TIMx_CNT < TIMx_CCR*时,输出电平有效,否则为无效
                                                                                    向下计数时,当TIMx_CNT > TIMx_CCR*时,输出电平无效,否则为有效
                                                TIM_OCMode_PWM2                     与PWM1模式相反
    TIM_OCInitStructure.TIM_OutputState     =   TIM_OutputState_Disable             禁止OC*输出
                                                TIM_OutputState_Enable              开启OC*输出到对应引脚
    TIM_OCInitStructure.TIM_OutputNState    =   TIM_OutputNState_Disable            互补输出使能。关闭OC*N输出
                                                TIM_OutputNState_Enable             互补输出使能。开启OC*N输出到对应的引脚                          
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时,如果实现了OC*N,则死区后OC*=1
                                             TIM_OCIdleState_Reset               当MOE=0时,如果实现了OC*N,则死区后OC*=0
TIM_OCInitStructure.TIM_OCNIdleState    =   TIM_OCIdleNState_Set                当MOE=0时,死区后OC*N=1
                                             TIM_OCIdleNState_Reset              当MOE=0时,死区后OC*N=0
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);                    禁止OC1重装载,即TIM*_CCR*的数一经写入立即生效,否则要在下一个更新事件到来后才被装入寄存器

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                      输入模式下,捕获端口上的每一次边沿都触发一次捕获
                                                TIM_ICPSC_DIV2                      输入模式下,每2次事件触发一次捕获
                                                TIM_ICPSC_DIV4                      输入模式下,每4次事件触发一次捕获
                                                TIM_ICPSC_DIV8                      输入模式下,每8次事件触发一次捕获
    TIM_ICInitStructure.TIM_ICFilter        =                                       捕获采样频率,详见TIM*_CCMR->IC*F说明
    ----------------------------------------------------------------------------------------------   
    死区设置
    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      =   这里调整死区大小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);
/* 基础设置*/
TIM_TimeBaseStructure.TIM_Period = 65535;    //计数值  
TIM_TimeBaseStructure.TIM_Prescaler = 7200-1;    //预分频,此值+1为分频的除数
TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数

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

/*使能预装载*/
TIM_ARRPreloadConfig(TIM2, ENABLE);
/*预先清除所有中断位*/
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开始计数 */
TIM_Cmd(TIM2, ENABLE);





使用中央对齐模式的提示:
● 进入中央对齐模式时,使用当前的向上/向下计数配置;这就意味着计数器向上还是向下计数取决于TIMx_CR1寄存器中DIR位的当前值。此外,软件不能同时修改DIR和CMS位。
● 不推荐当运行在中央对齐模式时改写计数器,因为这会产生不可预知的结果。特别地: ─ 如果写入计数器的值大于自动重加载的值(TIMx_CNT>TIMx_ARR),则方向不会被更新。例如,如果计数器正在向上计数,它就会继续向上计数。 ─ 如果将0或者TIMx_ARR的值写入计数器,方向被更新,但不产生更新事件UEV。
使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIMx_EGR位中的UG位),并且不要在计数进行过程中修改计数器的值。
互补输出和死区插入高级控制定时器(TIM1和TIM8)能够输出两路互补信号,并且能够管理输出的瞬时关断和接通。 这段时间通常被称为死区,用户应该根据连接的输出器件和它们的特性(电平转换的延时、电源开关的延时等)来调整死区时间。
配置TIMx_CCER寄存器中的CCxP和CCxNP位,可以为每一个输出独立地选择极性(主输出OCx或互补输出OCxN)。
互补信号OCx和OCxN通过下列控制位的组合进行控制:TIMx_CCER寄存器的CCxE和CCxNE位,TIMx_BDTR和TIMx_CR2寄存器中的MOE、OISx、OISxN、OSSI和OSSR位,详见表75带刹车功能的互补输出通道OCx和OCxN的控制位。特别的是,在转换到IDLE状态时(MOE下降到0)死区被激活。 同时设置CCxE和CCxNE位将插入死区,如果存在刹车电路,则还要设置MOE位。每一个通道都有一个10位的死区发生器。参考信号OCxREF可以产生2路输出OCx和OCxN。
如果OCx和OCxN为高有效:
● OCx输出信号与参考信号相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。
● OCxN输出信号与参考信号相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。 如果延迟大于当前有效的输出宽度(OCx或者OCxN),则不会产生相应的脉冲。 下列几张图显示了死区发生器的输出信号和当前参考信号OCxREF之间的关系。(假设CCxP=0、CCxNP=0、MOE=1、CCxE=1并且CCxNE=1)

以上文字的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
SPWM的产生.doc (70 KB, 下载次数: 297)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏10 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:485457 发表于 2019-3-25 16:08 | 只看该作者
好贴,学习了。
回复

使用道具 举报

板凳
ID:485457 发表于 2019-3-25 16:09 | 只看该作者
学习中,太有用。
回复

使用道具 举报

地板
ID:536159 发表于 2019-5-12 17:10 | 只看该作者
好贴,好好学习
回复

使用道具 举报

5#
ID:540446 发表于 2019-5-17 09:29 | 只看该作者
学习了 谢谢
回复

使用道具 举报

6#
ID:540446 发表于 2019-5-17 09:30 | 只看该作者
学习了 谢谢
回复

使用道具 举报

7#
ID:540718 发表于 2019-5-17 15:16 | 只看该作者
学到了!
回复

使用道具 举报

8#
ID:511461 发表于 2019-5-20 19:48 | 只看该作者
好贴,谢谢大佬
回复

使用道具 举报

9#
ID:381972 发表于 2019-6-7 11:38 | 只看该作者
受教了,但是我还是没有看懂,就是还不懂为什么是128个数据,而且如皋我要把SPWM的频率改为20KHZ,应该是128*2个数据吗,就是很迷惑,望大佬指教
回复

使用道具 举报

10#
ID:355325 发表于 2019-6-17 18:01 | 只看该作者
好帖,可以学到嘻嘻嘻
回复

使用道具 举报

11#
ID:568628 发表于 2019-6-21 15:21 来自手机 | 只看该作者
学习了,谢谢
回复

使用道具 举报

12#
ID:264932 发表于 2019-6-27 10:03 | 只看该作者
好东西,学习了
回复

使用道具 举报

13#
ID:458593 发表于 2019-7-8 11:45 | 只看该作者
正在学习中
回复

使用道具 举报

14#
ID:423309 发表于 2019-7-22 02:38 | 只看该作者
这个真的很好
回复

使用道具 举报

15#
ID:589843 发表于 2019-7-24 16:59 | 只看该作者
表里是100个点啊,不是128个
回复

使用道具 举报

16#
ID:510578 发表于 2019-7-28 09:34 | 只看该作者
阔以阔以
回复

使用道具 举报

17#
ID:595073 发表于 2019-8-4 16:53 | 只看该作者
有用,感谢!
回复

使用道具 举报

18#
ID:687341 发表于 2020-1-21 10:11 | 只看该作者
谢谢兄弟
回复

使用道具 举报

19#
ID:203971 发表于 2020-3-17 13:46 | 只看该作者
谢谢分享
回复

使用道具 举报

20#
ID:600982 发表于 2020-6-11 08:23 | 只看该作者
学习中,太有用。
回复

使用道具 举报

21#
ID:600982 发表于 2020-6-22 10:51 | 只看该作者
谢谢分享
回复

使用道具 举报

22#
ID:338011 发表于 2021-2-3 22:58 | 只看该作者
学习中,太有用
回复

使用道具 举报

23#
ID:376366 发表于 2021-2-5 15:18 | 只看该作者
我想把这个改成生产1K的正弦波,可以吗?还有就是用16位的单片机可以吗?
回复

使用道具 举报

24#
ID:905785 发表于 2021-4-17 18:40 | 只看该作者
请问互补输出是什么意思呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表