找回密码
 注册
关于网站域名变更的通知
查看: 434|回复: 2
打印 上一主题 下一主题

如何产生带有死区时间控制的互补pwm?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-9 19:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
想请教一下站内大神,想要产生如下图所示含有死区时间的互补的pwm,具体的编程语言怎么写。我自己写的这一段只能在上升沿出有死区。
% P# ~8 ]- _( \- [+ l/ `5 z. ^always@(posedge CLK50M or negedge Rst_n)
% b- Z/ l3 |% Q  b8 \! b
, X9 K- Y" j9 B" G3 R3 Jbegin9 j1 E% R- M# c9 Q8 n
    IF(!Rst_n)begin
0 {6 w! R1 L4 k0 i' G   cntd1<=5'd0;
, O1 P6 {1 `$ N$ [( F* f/ E   dpwm_od1<=1'b0;
  y6 D$ R% {+ Z( @2 ~: ^( f$ d/ ~   end! m6 A7 @$ w5 a" _/ A9 Q- ~$ g- J% t
    else begin
' ]1 }7 s7 D% \6 ]        if(pwm_od1i==1'b0)begin. [( a" S7 r2 G3 Z: V' ~9 Y
             cntd1<=5'd0;) W' b# _8 G6 C
     dpwm_od1<=1'b0;
8 z2 f# ], L* A7 d# G0 R( K% Y     end
" K. g$ C8 p) S9 K, c: G     else if(cntd1==d_set)begin6 e, g2 }) r, X3 O: v
                 cntd1<=d_set;; J/ z$ f( G9 Y+ A! [4 m4 H8 l
         dpwm_od1<=1'b1;$ E$ E$ v/ F# u0 g+ V% E
         end. @2 \9 Q) k# F8 O- w* t+ M
                  else begin
; p' @2 g6 i" I+ e, S6 b0 V5 V                       cntd1<=cntd1+1'd1;
: L" @0 C: C* X& l8 X0 n. ~           dpwm_od1<=1'b0;" Y. ~7 J$ t1 E4 p  _0 \" s
          end- p5 {, ]5 r4 u. q
   end  l, M3 H7 e) V' h- _
end  8 H% l" w! b( r* [7 r  q
有大神可以解答一下吗,非常感谢!9 ^& {8 j- Q% X

该用户从未签到

2#
发表于 2020-6-9 19:35 | 只看该作者
用高级定时器TIM1产生一组互补PWM,用通用定时器TIM3输入捕获,测量PWM的频率和占空比。% _. y+ M+ [3 U: c  Q
1、互补PWM输出% G( b% t" G# u+ _
使用高级定时器1的CH1和CH1N通道,该定时器可以选用144M的高频率,对应选用输出引脚PA8和PA7,参考库函数使用手册的步骤,大概概括一下:0 t9 S; |7 H4 t. x
1.使能时钟和配置相应GPIO,几乎所有外设使用的第一步
% q& _/ g( x3 P' D2.配置定时器分频值,重装载值,计数模式等基本参数
: {2 R1 y! G. b$ R# s3.配置OC参数,也就是OCInitStructure结构体,注意CHxN的输出状态要使能,才能输出互补7 s# Z& z" I0 `8 Q
4.完成上面步骤就可以输出互补PWM了,如果需要死区等功能,再配置BDTR7 {9 }' w8 k' L& _  X
5.打开定时器,使能PWM输出
$ T' u1 N% R9 U% r( J% U7 I8 A4 [下面是使用144M频率产生100k PWM的主要部分代码:* f7 S( G% z+ ]5 R/ k6 E
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);3 ?$ M: R  O  s
        RCC_TIMCLKConfig(RCC_TIM1CLK_PLLCLK);        // 选择144M时钟
( P) [/ J2 @( A3 P% N        TIM_TimeBaseInitStructure.TIM_Prescaler = 0;
/ b" K4 J# X8 a9 ]/ u9 R! H        TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
+ f- B3 R  d% F3 }5 m3 v% A; ?4 a        TIM_TimeBaseInitStructure.TIM_Period = 1440-1;//144M/100k=1440
/ ^' D+ g, n. p, c) e5 F        TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;
* E: @" D, ]! Z9 J6 N0 C        TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0x00;$ \4 c. U' _9 U8 G3 [4 j
        TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStructure);
$ V' f# o; f/ {1 t7 v        TIM_OCStructInit(&TIM_OCInitStructure);
# ^; v: n; b0 K! M2 E! v        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
3 Z' `" z* q5 M8 T+ `1 h# t        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;: z2 w! E% }' B
        TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//开启互补通道
% A$ p1 \( N3 f7 r1 G# i        TIM_OCInitStructure.TIM_Pulse =720;//脉宽,50%占空比,1440/28 Q( w/ I& H8 B: G
        TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;4 m+ M2 L8 ]- T7 S% _- w
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;1 m( F  a+ |0 _* y1 o( r
        TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
' l2 H( ^0 g! T& N        TIM_OC1Init(TIM1,&TIM_OCInitStructure);
# A4 i& k' |/ D2 D/ [6 d, N9 M. g! V/ i- Q        TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
( C8 X0 V1 C3 Z  F        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;9 A3 |9 |) n# T7 R3 {- J8 J
        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
: k: x, B5 H5 I! y. H& B, p8 [        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
1 P+ l; v0 W/ P        TIM_BDTRInitStructure.TIM_DeadTime =1440*4/100;//5%死区,则实际占空比45%6 A; j- g3 d( F- p0 _
        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
. l9 |* ?) F5 i, R8 \% a0 ]        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
/ Y* v' b, o" |9 y: o        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;& N' a! ^. h" o+ v+ z2 U
        TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
6 q  t# b; |- l5 y% R) z3 |        TIM_Cmd(TIM1,ENABLE);% S& h5 V: p5 u& V' R
        TIM_CtrlPWMOutputs(TIM1,ENABLE);" _+ Y- v  i$ ]

  E- r9 s( K- }0 t4 h: w复制代码
5 `, t9 M0 r5 Z9 j8 }用示波器可以查看输出波形。: p  k, k0 q: f  B1 e5 J
2、PWM输入捕获" E- x8 X5 t+ j: A6 k
用这个功能可以测量输入波形的频率或(和)占空比,使用的是定时器TIM3的Input capture mode,可以测量频率或者占空比,为了方便同时测量这两个量,使用该模式中的特殊情况PWM input mode

点评

先看看再说  详情 回复 发表于 2020-6-9 19:35

该用户从未签到

3#
 楼主| 发表于 2020-6-9 19:35 | 只看该作者
lilino 发表于 2020-6-9 19:35* m" p# b( `+ p) @3 z% D
用高级定时器TIM1产生一组互补PWM,用通用定时器TIM3输入捕获,测量PWM的频率和占空比。
3 O$ X5 L) g, Q" [8 s1、互补PWM输出! Y2 h0 z% p# q% k( T0 p
...

+ W; O& W; W+ ~8 b/ O先看看再说
2 T0 y, _5 Q0 L) r; B' d) [" I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-13 09:56 , Processed in 0.140625 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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