嵌入式开发者社区

标题: 请问一下怎么产生PWM波 [打印本页]

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家( f1 |& L9 ?2 ?1 t# c: x$ ^

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
) f; u( B6 y9 N1 ]: x/*                                                                          */
7 J5 h' p4 Z7 x" K; p/*              宏定义                                                      */8 w: |7 D* }* U1 \' Q# {1 R# _4 e
/*                                                                          */8 c' U2 ~9 G$ W
/****************************************************************************/4 Q" l7 D8 m6 x: s0 d4 H
// 软件断点
7 u, b. j0 d" v" J& k& G#define SW_BREAKPOINT     asm(" SWBP 0 ");
5 ?8 N1 }1 U' w/ R+ v" F! j  t& j+ p/ f0 m$ g# v, S
// 时钟分频4 B9 f% M! J( D$ X" C" e7 L9 ]4 U1 H
#define CLOCK_DIV_VAL     228
* ~4 X1 Y) f% @: n- Q3 n1 `# M* ?7 V) B! z) L. |( q& C  y
/****************************************************************************/" O0 z6 ?) B9 D. v, U. q
/*                                                                          */
+ u# m# {2 \+ F6 S, p8 k0 [4 Q/*              全局变量                                                    */
/ K# E* i8 j: D  W/*                                                                          */& `0 [7 \" n5 H0 q; {5 q5 ]4 _
/****************************************************************************/) k3 \/ J. i1 z# O) l' r2 S
ECAPCONTEXT ECAPResult;1 o" L! m4 H! Z8 F; r" v8 W* c
$ i; m" B; {- D. s" R# x3 j* [
/****************************************************************************/
& n+ J7 @" U2 b; l6 p/ z/*                                                                          */! v/ W6 z* Q, V7 }
/*              函数声明                                                    */
1 [1 b0 O: M9 X; n) {; X# Y/*                                                                          */5 U* c2 ~, p8 w  E" u6 j. n" G7 f8 S
/****************************************************************************/: Q0 P4 ?% }( L3 E0 a
// 外设使能配置& `/ ]( s% K2 V4 p4 b' J
void PSCInit(void);% ]6 |. C( [0 q) u7 f9 l
4 _. i  `7 a3 Z$ l0 I$ M, C
// GPIO 管脚复用配置( c8 S' T# w5 l; ], n7 }
void GPIOBankPinMuxSet();
  O$ [& k* V8 m5 |9 i* V0 }- `# q
& T  a1 N- F& N9 B7 C// 产生波形
9 V0 d; L" R% G$ [4 k) gvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 H! ]* H. H8 ]6 @void ChopperWaveform(void);: e( s4 B& L  w/ O$ ?4 k. n

/ g# ^2 o7 h8 F' B# R: L4 T) a// ECAP初始化和读函数0 l0 ~' u9 I4 ^
void ECAPInit(void);
$ }+ G+ t4 j1 C  r; Junsigned int ECAPRead(void);
3 d; ~. y/ }. F3 t1 |9 C  u5 h5 j" g
//ARM 中断初始化$ U$ G  D7 |0 {
void InterruptInit(void);$ B9 X4 g- P/ n# M8 J: g

. H$ n: V$ ?  h" I// PWM 中断初始化
2 u3 T( W5 Z1 ^6 W' ivoid PWMInterruptInit(void);. q3 S/ ~2 ~5 U
// 中断服务函数
0 B  L# d8 h2 V' b// PWM 事件& S7 J$ d3 H8 H0 [5 N( t
void PWMEventIsr(void);
0 E$ {" `$ d' M' y+ S5 _0 P// PWM 错误控制事件9 M$ G; l% N, Q
void PWMTZIsr(void);/ B: }$ V. c' e1 a

, m& f) N* ]" K3 c7 j8 B/****************************************************************************/
7 Y- P: g# k3 H. d& k7 C% X/*                                                                          */
# r" |( n2 ], N. y/*              主函数                                                      */
2 q/ _. l$ `" k% R3 R7 D: _/*                                                                          */
& X/ r2 I. f0 v) z3 b2 \4 g/****************************************************************************/
5 B4 s0 }. @& B* t- Dint main(void); X$ u! s& y; T& s/ j
{+ ]. g- [9 y* \, K
        // 外设使能配置- r' @# C% B$ n2 f3 q+ Q6 R4 s9 M8 W
        PSCInit();2 p+ R! |7 n: M- A0 Y

, x( o6 j1 Q, Z$ ?+ o9 U        // 初始化串口终端 使用串口2
9 [6 s  Y; Y1 Q8 @; z( P        UARTStdioInit();
5 ^+ {+ \( [2 }  v          Q: {! x" R( r0 O7 Y$ W! d
        // GPIO 管脚复用配置
+ @0 a1 q* ?) _) k" h        GPIOBankPinMuxSet();
$ n: S: h' B8 K) H
& C6 |4 i$ ]# U, @1 \        // ARM 中断初始化
6 [+ \5 F5 W- E+ F3 ~7 W/ n& |        InterruptInit();
5 b. ^5 \6 ?4 V+ X  Z
# C4 J8 B- x! _        // PWM 中断初始化9 C/ K3 p- w: ^; i% F- I- h1 x2 s
        PWMInterruptInit();
6 e, z/ A, I' J  o6 T2 F# {6 t# l$ Z) j: v3 h2 w9 S
        unsigned char i;- N$ `; }4 S  I7 r1 s0 }, }
        unsigned int j;0 x2 ~  I) H  g$ T4 D% V

3 }0 L4 t- o2 s' y( Q3 S" Z. ]        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
) D" H& {9 Z! }" N9 T9 x        UARTPuts("------------------------------------------------------------\r\n", -1);$ i$ ^7 N. d9 `3 `7 k# C
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
* \0 F- j& b, A& U% s  u& {3 _        // 产生波形
, m. `( e2 h7 d7 Y        PWM1ABasic(25000,50);
. V2 g' L+ I5 y6 z* f( C" T2 X$ Z2 _  B4 ~: J4 I% ?8 t
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);7 x. {+ M" @, r6 g$ g2 m$ ?# Z
        UARTPuts("------------------------------------------------------------\r\n", -1);6 z4 y# \1 U% ?0 f* f' R1 X! a

- g& B- V  d4 Q/ {8 a! k/ v  }2 ^0 [- {- M2 z; r4 C

8 Q; q. D- J# N# e# Y; |        UARTPuts("------------------------------------------------------------\r\n", -1);
1 j3 s9 S; c* e/ w- g$ C  _        UARTPuts("                    C6748 ECAP Test\r\n", -1);
3 o: Q  J2 M# @6 c        // ECAP 捕获初始化
; h+ m6 r, M0 O5 F        ECAPInit();! m! u+ ?1 A( [8 V% ]7 j0 m
        UARTPuts("Initialize ECAP.......\r\n",-1);# u/ P; u5 @7 W7 D$ A0 q4 Z3 w
        for(i=0;i<5;i++); j% ~  a: h8 Z* N+ M" a1 K
        {" V( ?( T  {) ~/ A1 n
                    for(j=0x00FFFFFF;j>0;j--);            // 延时5 t* l' |/ c7 L$ J8 c8 i
                    ECAPRead();" D9 V# a+ B% X# h# ^/ B
        }! Q2 {, K& E  i( ]/ ?8 s
        UARTPuts("\r\n",-1);& T1 ?; }& ~" b* s, k; A- ]- e
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);7 Y- s; ~/ ]  f- F" y3 G& p# W
        UARTPuts("------------------------------------------------------------\r\n", -1);! i3 H2 p" o4 l) U% H! V- T' k
) N/ c5 U! u& U7 ?1 i# K  _( \
        // 主循环
/ c; g- L( Z1 A4 B3 N        for(;;)
0 g/ w' K. o& G: o8 P% ^        {8 O+ I, j2 e$ @' B5 e, ]
. i  B0 i1 z8 J+ U( N
        }
; K0 [7 }3 y$ M2 U0 f/ p, a; _}' e7 R  _; L  ?/ w

& h1 l' D2 M: Z' v/****************************************************************************/. P# |1 m" r3 U+ Y: }/ }
/*                                                                          */" d2 u5 m6 V0 D0 w# h
/*              PSC 初始化                                                  */( T6 J, p+ ?8 I* d
/*                                                                          */
7 E; ^- k6 ]2 N% q* V" O/****************************************************************************/
  r0 M4 a, L5 F) x7 f1 Hvoid PSCInit(void)
# P+ g6 w+ `7 C. b9 h: W) J{
! g4 z* p3 o8 g1 z        // 使能  EHRPWM 和 ECAP 模块# Y* H0 g5 W  k  K7 N: D* Q' a
        // 对相应外设模块的使能也可以在 BootLoader 中完成( I) g1 ^. @" \0 e! q7 l( I5 [  _
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);9 [4 f$ \% a1 t5 j# D& W
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);2 T5 k) {# O2 R/ V; E7 Z; i
}
: s  s7 f, T+ t2 C2 L2 j- [6 D& b7 `* w( E  y$ _# z8 n; {  i
/****************************************************************************/# u3 j) w+ T7 D# u; \
/*                                                                          */$ h+ a) O$ P7 s1 \* }& i7 ?: u: I( X. V- u
/*              GPIO 管脚复用配置                                           */9 O! f3 ~, ?8 \8 l% e
/*                                                                          */& H: K) G3 F& x7 _, M; R9 X
/****************************************************************************/
$ e, @0 R' G: l% i+ M6 [void GPIOBankPinMuxSet(void)6 y) A* o0 X5 Z% c( o
{* k" h( Y( h* g$ m, p8 B8 \4 `
        EHRPWM1PinMuxSetup();4 N1 ~/ h/ T% X1 c- z5 A  O+ g

, _7 J8 Q# T" o        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)6 p, w: b6 T+ E' F2 V$ @0 W
        // 作为捕获功能时管脚方向为输入
7 x+ T# c1 X3 X0 u0 e. z        // 作为辅助脉宽调制时管脚方向为输出
. C+ @; {. @" C" y    // ECAP2 / APWM2
* o+ y, ]! p$ N: M; b  D        ECAPPinMuxSetup(2);: D; d) q6 e) M/ z! H' \
# x: U. S; l6 x8 u' c
        // ECAP2 / APWM2方向设置为输入; J+ C5 j( V8 O; v5 \( }; b" g
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
% P4 m6 u9 s6 n+ J}! X0 {0 H7 ]( c) {* E% l/ c$ ~" u

# I" }: n/ h) P: T- _4 M  K/ d& }" S/****************************************************************************/
$ h( n& n, d4 p, Q* c/*                                                                          */
( ^3 s$ R! x& f: h/*              PWM 输出波形                                                */
  w5 C, Y! X( w/*                                                                          */
+ s1 P! _+ @* k* |! }) h/****************************************************************************/
1 p9 h" _6 O2 ~- Q( E$ V% S& bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)  q7 y9 j9 y. }3 |7 ~8 G! S
{
7 d0 n; a5 M7 Z    // 时间基准配置6 S7 p7 |9 v, Q$ X) d& h" L  H
    // 时钟配置
* C: Z- D9 q- G6 M+ d; ~, n# D    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);, f5 `( g0 S: M/ u/ P. M3 n9 V

. z4 R6 L; ~* B- R2 e4 q# e, p, v    // 配置周期$ D% m0 t0 z' |' t& V) F, H( I
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,  a/ v$ m  }# {0 [9 t
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 b- g, F# Q, x+ V
4 M' L/ e/ }* d9 U    // 禁用输入同步信号
& m* ^4 l, y( z- _4 R6 d/ o4 e    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
- @9 c4 D. r* G# e) j! b9 e8 n+ w& I2 d: G
    // 禁用输出同步信号
+ P9 _& k  U9 o* M    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- ?, y, ^9 B( u3 ^; w" [3 y# Z
2 m' B$ ~) Z8 I+ p1 f. L, V    // 仿真(DEBUG)模式行为配置
: i$ l, q9 x, W" R7 D& {) ~    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);( t* S- `5 Q% W- v  m* K

! N) \. }, `5 j8 ~5 C) P5 Y2 T    // 配置计数比较器子模块
- \& Y6 \2 Z2 f6 Z/ k9 Q9 I    // 加载比较器 A 值  e' q' p- X6 e' E" G$ [
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,& k& h( k1 _  ^- n* y: O
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 E  F: z4 G  y5 |4 @. G# M8 c' v
" b; w) |% g4 u1 D    // 加载比较器 B 值
; `) l9 \/ f7 H) ^5 y6 A" }    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,4 S6 L/ z! u7 A! j
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);1 L# ]) r" B+ k+ A; m6 u3 u

4 A/ `1 d! [9 K- T6 K1 O. P. C4 c- l    // 功能限定配置(输出引脚触发方式设定)) W7 Z1 \, {# U3 H
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
. p1 w1 B, Q, l. M" b* m8 Q* o    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ s' G+ F, k; F, ~& D: I: s
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,, b: I7 B: l" e8 _, h* C6 s- t
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
  e, W/ D) \5 ]( d, ^  N4 B$ b' Y) P. F: ]
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
- C- c" D3 o) ]) r, _    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);; d1 R! U: F5 ~; X# i

7 p& C# j9 a) n1 [    // 禁用斩波子模块1 ^+ B7 g& o$ q6 Y+ t0 `$ [
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
6 h( X( o; d6 u& K" R, `; H1 J! ^" h% d, Z' ~, T
    // 禁用错误控制事件
, V1 s7 _6 n- ?8 A. f$ e5 p, f    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
6 z, k  f# v+ Z+ O" n    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
2 Z% t, M8 o: Q* ?  A: K" a6 w+ H) l* L3 [6 D- w3 c
    // 事件触发配置# J2 T  D$ g/ v
    // 每三次事件发生产生中断/ g( g5 @- l: |7 P3 l
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( t1 z3 r4 U* T/ y2 l
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件0 ~" V# D9 x8 D) |5 i
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);/ M) j- Z6 q1 f. H" D# @
    // 使能中断* R2 |+ Y0 T0 h# I' w
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
  s/ s- U1 g+ [: L+ @  u4 b: F& c/ M* H* ~/ e+ W* l
    // 禁用高精度子模块. o6 t2 v0 U7 t. h1 T  G
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);+ C# _( B& U( ?; X
9 q5 F0 f5 ^5 a0 w
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" R/ `: O4 ^: W* B}
- y3 `9 G4 H5 Z8 K+ A. u: w9 l6 |' Y4 ?- W! q2 d4 l" `. k
void ChopperWaveform(void)& [, R8 ?3 d- y  V
{
% O6 O7 g* C1 i9 F. H7 ]  T% h$ \/ _    // 50% 占空比
7 y. R" ]) R  ^# Y    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);5 \' X' t. I* y" E% |
    // 4 分频  z# {: B+ i# ?3 Z7 r
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- L6 \' i) e* T7 S/ h
    // 单个脉冲宽度$ x8 h, }8 y: |, I+ R  o+ u5 o
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. s" W- u7 \& p    // 使能斩波子模块
# I3 K% c  ]/ c' r6 c    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);) g$ l  t8 z4 h; k! N" ]) i
}- \' T9 y4 l8 A/ V! O+ n( n
! a0 l. B. k8 F5 m( d: B2 A
/****************************************************************************/6 f: [! P% H! b3 Y: L* j
/*                                                                          */' u+ X; v7 `, E4 d
/*              PWM 中断初始化                                              */
1 [7 q' b" |& L/ e% G/*                                                                          */
0 }0 B0 L3 d  `' u. W( h/****************************************************************************/
$ p1 b3 Z. @1 R! S) ~. b* zvoid PWMInterruptInit(void)' T, E! Z! }' H$ I. d$ r
{
. Q8 _2 |3 K/ g0 Q' E- _5 X        // 注册中断服务函数5 i. }. _+ d2 _' r0 w
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 j0 _6 a6 m& F& T3 e3 J% p& Q        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
. w. m: @0 ~* m) {7 X5 J1 f7 s/ C! m0 q- Y3 m0 X* p9 F
        // 映射中断5 c$ i6 H, Y  A+ W4 Z9 v: Y4 f% y
        IntChannelSet(SYS_INT_EHRPWM1, 2);
0 j$ x( ?+ a* G9 W6 h, L9 L2 n' i        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);0 C) \7 w. j& a& l" ^

9 q" U9 _; K; w( p0 t7 o        // 使能中断7 h2 y/ u5 r" H* C1 M+ y; U+ a
        IntSystemEnable(SYS_INT_EHRPWM1);! q  X; L! `+ \% e2 z
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
) }8 }8 X7 e$ z# W}- V" U5 C4 v0 P

: D  u2 J/ ^* M( m* l9 P5 ^/****************************************************************************/
0 j, I; \: G" c1 [$ r3 Y/*                                                                          */
2 O3 Z2 Q- A( c8 O4 }# q/*              ARM 中断初始化                                              */
2 q; u% [4 ~. ~& j/*                                                                          */
/ h6 j/ b( ?# y2 Y+ ~. k, S3 k/****************************************************************************/' J* e  j8 [( D$ ]
void InterruptInit(void)
) H( Y# R: o# q8 k7 b3 ^$ O{
' G: N8 m3 _1 ?# [4 [3 c        // 初始化 ARM 中断控制器
, l- C5 ~+ l4 S  V. _        IntAINTCInit();
: d0 n' p  ~9 d/ k& i" W; _+ c3 ~8 F4 D# e. m- ^2 ?" E4 X. a6 Y4 p
        // 使能 IRQ(CPSR); }/ e, _- ~, v( [  j/ v  x
        IntMasterIRQEnable();
5 M% N& U  |( v9 Q5 d
, A2 Q6 z9 v. u; a* m        // 使能中断(AINTC GER)
5 k0 a0 w/ G) q# y' Y/ o; C! M        IntGlobalEnable();) R$ f9 T+ i, z. T

7 q3 [; |; {) y( {3 a        // 使能中断(AINTC HIER)8 {/ m0 L( `  M6 L" }: Z/ P
        IntIRQEnable();4 d4 c1 r7 W" P3 d* Y$ N* S
}. Z! l# S' o0 L: w
% h! Z5 ]1 p( L6 h' V# i5 @! M

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
) Y" m; j4 Y0 T' e; g. m/*                                                                          */
. G2 l, k" r4 d% p  t/*              中断服务函数                                                */% j/ q4 c, G. P. u* O5 s% \; W
/*                                                                          */1 k4 A  K+ B4 I/ ~& G4 Z
/****************************************************************************/
$ n1 |# r1 ^! a$ a, ivoid PWMEventIsr(void)
4 e( O0 j1 k+ L% d; w- d{9 p% j, O* H. _) v
        IntSystemStatusClear(SYS_INT_EHRPWM1);! [: {! Q! `2 o; u. k7 C- ~$ k9 {7 K

' T, n/ Y: e- g/ k0 |' W! f, `& m9 ~    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
* f1 L' C- B% E, H}3 f! j' U- C  i9 E. s9 Q

8 }$ o) w! u- r. y* M" ]void PWMTZIsr(void)
2 n, E/ ^1 T6 @( j" I1 u{$ C+ B- ^% o* E0 C$ Z
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);2 m) b4 t: z+ H% l( \$ _# r

# b4 S: T# h! `2 y5 q    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
' y5 g, c; h' \8 L4 r9 n7 a}0 P: Y8 ^0 ^5 g1 X$ I( E

, I0 ?( H1 j+ S, u' x  N7 J/****************************************************************************/
% m4 z2 l$ F. o( i% z/*                                                                          */
3 E4 K/ e. |4 m3 B0 A$ D& K5 f6 H/*              初始化捕获模块                                              */; D( n4 J( k: @
/*                                                                          */
+ p  I) T' ^9 W0 z% }/****************************************************************************/# r; B3 `. d& j0 R4 o
void ECAPInit(void)
2 j% p& D# z" g4 @7 p, g6 ~{
; Z1 a+ i( K0 J9 d% A5 Q        /*-----设置 ECCTL1-----*/2 i( [# O7 n7 A8 J* y, p5 u/ N& h
        // 使能CAP寄存器装载
" G4 b" w3 b& C8 o1 K- v  z. N        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);/ _, P* Z# P1 \& l; P7 [9 \
        // 设置预分频值.% o- O+ N' M) {; E' }: c' r
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
: F! B& H- O# k0 r. f. c  p        // 上升沿触发捕获事件
  W3 z5 q% X6 h* T! Q        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);, g' l* G: c5 [8 \- Q9 \
        // 输入捕获后重新装载计数器值.) P+ K7 J, B' j: [1 q
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" [, E( x& w. v8 [$ R
# b) V) f: Z0 y        /*-----设置 ECCTL2-----*/
, O6 ?* d) w' ?( J) H8 h        // 连续模式
# F" F7 q$ q0 K! Q* B3 ^. S: }* b        ECAPContinousModeConfig(SOC_ECAP_2_REGS);! L* U4 u5 ^! f( H& a
        // ECAP计数器TSCTR持续计数$ N. |% r% Z7 [# s& }! K
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);& |8 }, A8 s/ K
        // 禁用同步输出和同步输入
" j" L, D: z2 L9 Z0 H        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
3 V, L/ z& H" U        // 配置 ECAP 2 为 CAPTURE 模式
  q# I# y) E8 P2 O        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);) Q: P* y9 |; n" U- I% N* i8 ]( R
! r1 U- h+ K9 k2 Z( W* D5 {% k
        // 使能中断
  Z% d; t& Q( r//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);* v6 T2 Z. l' L. ]
}
+ T* N- x  B4 w) _4 j6 h4 K6 I& i
/****************************************************************************/5 R- ]3 W5 m$ A8 z+ \: J
/*                                                                          */
3 a7 K5 Z( l, u$ R/*              取得捕获结果                                                */) v/ D# Z- V* M9 y& w2 C
/*                                                                          */
- S& u3 m" F# l5 Y. P2 L/****************************************************************************/; ?9 E+ e+ _! Y, B4 E/ Z
unsigned int ECAPRead(void)* z9 }9 Q) n5 Z* _( n9 P& Z1 ^2 l
{
  X% Y6 H$ C9 L6 A        unsigned int capvalue;+ P' E5 ^) p! c* I7 k4 p& r) c! A
        unsigned long frequency;
1 ]  r6 r4 }( m. ^3 G! N. b8 `& D/ h) `8 n) V/ \; X
        // Event1 中断标志3 W: n8 e) @) }1 H' t5 I. N9 G
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))( _2 }: i. R. ]0 \
        {
- k6 [" l, [8 S" d: r" f  r                // 取得捕获计数
  w8 s8 F+ b) _) T7 C$ x                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
) @. N: R1 D6 ^( ~                capvalue = ECAPResult.cap1;
8 O( m5 @& y: f) L$ p; F2 T0 Y$ ~# I, e; t% L
                // CAPTRUE 模块 228M 时钟主频0 C  G1 ]7 b, g% s0 `, S' C
                frequency  =  228000000/capvalue;
$ _6 ^/ j: Y1 u% A, Z# ~- l$ `                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);: @& E1 S+ b7 H9 x1 ?
0 @# I$ Q; Q4 u( g0 ?. o' `  [7 I$ V8 f
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
  t, U/ A& E) V9 Z3 \; V+ e& z//                IntEventClear(SYS_INT_ECAP2);5 w) K& S) }# \- Z4 u, R
        }5 ~! `# P0 A$ ?: ?( @
        return frequency;
0 l' T( X6 z6 y1 u8 N4 x}: |/ R+ U9 b+ L4 m3 i, c! B

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
) r7 R' W( n0 ^( c9 E. ^& R[attach]4202[/attach]
作者: 浙江第一帅    时间: 2018-11-1 21:27
可以给我发一份吗
作者: 广州创龙莫工    时间: 2018-11-2 08:51
如需获取相关资料,请发送您的客户信息到我们的技术支持邮箱:support@tronlong.com,我们会给您提供相关的网盘链接。




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4