首页 > 编程知识 正文

三角载波与调制信号形成pwm,stm32输出频率变化的波形

时间:2023-05-05 02:28:07 阅读:168298 作者:293

键配置对应于GPIONVIC中断管理计时器初始化计时器输出模式xsdfg_OC初始化(模式为xsdfg_OCMode_Toggle ) )频率和占空比的计算计数频率的计算

使用比较输出时,ARR表示计数的上限,几乎没有用。 计数频率由xsdfg_Prescaler成员变量组成。 如果配置了xsdfg_Prescaler=71,并且输入时钟为72 M H z 72MHz 72MHz,则计数频率将变为:

f=72m 721=1mf=frac { 72m } { 721 }=1mf=72172 m=1m计数规则

计数器计数到CCR中存储的值时,输出电平反转。 频率和占空比配置

通过根据计数规则修正CCR值的方法可以得到期望的频率和占空比。

例如,如果计数频率为1 M 1M 1M,想要得到10 K 10K 10K,则可以得到占空比为80 %~80 %~80 %的PWM波。

将空闲输出级别设置为0,关闭卷影寄存器并立即分配值。

程序开始后,立即进入中断,并为CCR分配20。 此时,电平为低电平;

计数器超过20时,电平反转,变为高电平,再次进入中断,将20 80代入CCR;

计数器再计数80,反转电平,变为低电平,再次进入中断,将20、80、20代入CCR;

……

于是,可以看出数百是1个周期,其中20为低电平,80为高电平。 输出PWM波频率1m 1000=10k Hzfrac { 1m } { 1000 }=10k Hz 10001 m=10k Hz,占空比为80 % 80% 80%; 该示例代码从PA6和PA7输出两条PWM; PA6频率为10KHz,占空比为80%; PA7频率为1KHz,占空比为20%

PWM驱动配置:

voidgpio_configuration(void ) gpio _ inittypedefgpio _ init structure; RCC _ AP B2 periphclockcmd (RCC _ AP B2 per iph _ gpioa|RCC _ AP B2 per iph _ afio,ENABLE ); //pa1pa2gpio _ init structure.gpio _ pin=gpio _ pin _6| gpio _ pin _ 7; gpio _ init structure.gpio _ mode=gpio _ mode _ af _ PP; gpio _ init structure.gpio _ speed=gpio _ speed _ 50m Hz; gpio_init(gpioa,GPIO_InitStructure ); }voidNVIC_configuration(void ) nvic _ inittypedefnvic _ init structure;/* enablethexsdfg3global interrupt */nvic _ init structure.nvic _ IRQ channel=x sdfg3_ irqn; nvic _ init structure.nvic _ irqchannelpreemptionpriority=1; nvic _ init structure.nvic _ irqchannelsubpriority=2; nvic _ init structure.nvic _ irqchannelcmd=enable; nvic_init(nvic_initstructure; }void PWM_Config () x sdfg _ timebaseinittypedefxsdfg _ time base structure; x sdfg _ ocinittypedefxsdfg _ ocinitstructure; GPIO_Configuration (; NVIC_Configuration (; RCC _ AP B1 periphclockcmd (RCC _ AP B1 per iph _ x sdfg 3,ENABLE );/* time base configuration */x sdfg _ time base structure.x sdfg _ period=65535; 在xsdfg_OCMode_Toggle模式中ARR为x sdfg _ time base structure.x sdfg _ prescaler=71; //72分频,计数频率为72m/72=1mx sdfg _ time base structure.x sdfg _ clock division=0; x sdfg _ time base structure.x sdfg _ counter mode=x sdfg _ counter mode _ up; //计数方案对xsdfg_timebaseinit进行向上计数(xsdfg3,xsdfg_TimeBaseStructure );/* outputcomparetogglemodeconfiguration : channel1*/x sdfg _ ocinitstructure.x sdfg _ oc mode=x sdfg _ oc mode _ to GGE x sdfg _ ocinitstructure.x sdfg _ pulse=cc R1 _ val; x sdfg _ ocinitstructure.x sdfg _ oc polarity=x sdfg _ oc polarity _ low; //空闲状态为低电平xsdfg_OC1init(xsdfg3,xsdfg_OCInitStructure ); xsdfg_oC1preloadconfig(xsdfg3,xsdfg_OCPreload_Disable ); //关闭阴影寄存器并为CCR赋值时,请立即/* outputcomparetogglemodeconfiguration 3360 channel2*/x sdfg _ ocinitstructure . xsdfg_oC2preloadconfig(xsdfg3,xsdfg_OCPreload_Disable ); xsdfg_cmd(xsdfg3,ENABLE ); xsdfg_itconfig(xsdfg3,xsdfg_IT_CC1 | xsdfg_IT_CC2,ENABLE ); }中断代码为以下:

extern __IO uint16_t CCR1_Val; extern __IO uint16_t CCR2_Val; uint16_t capture=0; u8 pa6_state=0,pa7_state=0; float zhankong1=0.2; float zhankong2=0.2; voidxsdfg3_IRQHandler(void )/* x sdfg3_ ch1 togglingwithfrequency=10k Hz */if ) xsdfg_getitstatus ) xsdfg3,xsdfg3 capture=x sdfg _ getcapture1(x sdfg 3; if(pa6_state==0) xsdfg_setcompare1) xsdfg3,capture CCR1_Val*zhankong1); pa6_state=1; }else{xsdfg_setcompare1(xsdfg3,captureccR1_val*(1-zhankong1) ); pa6_state=0; }/* x sdfg3_ CH2 togglingwithfrequency=1khz */if (x sdfg _ get it status (x sdfg 3,xsdfg_IT_CC2 )!=reset(xsdfg_clearitpendingbit ) xsdfg3,xsdfg_IT_CC2 ); capture=x sdfg _ getcapture2(x sdfg 3; if(pa7_state==0) xsdfg_setcompare2) xsdfg3,capture CCR2_Val*zhankong2); pa6_state=1; }else{xsdfg_setcompare2(xsdfg3,captureCCR2_val*(1-zhankong2) ); pa6_state=0; } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。