嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ v. o3 E" d6 _& v
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
1 @* |& m! L# U3 a; g" ]- R3 {* m/*                                                                          */
: K+ V$ @1 R) j' {- q2 \/*              宏定义                                                      */6 l7 P- C8 O7 T; m4 m. a6 h6 r
/*                                                                          */
8 A9 {4 \; I3 \0 ~/****************************************************************************/- f0 D& ~: A5 a7 s, K
// 软件断点' W+ ~0 ?. p( @0 f1 t- G! h
#define SW_BREAKPOINT     asm(" SWBP 0 ");
# ?2 H% U3 h5 _) A; U; {* A3 w% Q' F+ ?1 Z$ m  D; }
// 时钟分频
7 b/ m5 C0 T7 D7 y#define CLOCK_DIV_VAL     228
6 a6 ^! `" L( j* ?8 c1 n& {2 Q0 g3 T8 |: \, Z6 R- g9 Y+ Q, t
/****************************************************************************/
9 l2 s0 V+ T) L- `- u/*                                                                          */
& P* A1 Q  A' n  V6 h/*              全局变量                                                    */
. l& {4 K; z* ]$ W( u  ?! e9 T/*                                                                          *// `, ?' w& K6 L2 o
/****************************************************************************/
) s) ]% E: f& z3 xECAPCONTEXT ECAPResult;7 f. ?- c7 j6 k# `7 H8 q
5 F3 d- a- [7 ]; ]- K
/****************************************************************************/
$ ^$ R$ ]5 ?/ V7 E$ R/*                                                                          */, P1 D8 P3 ^& C  f  ?& a
/*              函数声明                                                    */7 \& ^5 @$ A$ k; G
/*                                                                          */. D  f0 x% g  F! z# G* z+ m) G
/****************************************************************************/* @+ Q$ _4 \- \3 `
// 外设使能配置
- T8 ]# e7 V; X. l6 {- n1 @void PSCInit(void);6 b+ E. M- q% Q
7 x' w9 D7 D, d% i& G: g
// GPIO 管脚复用配置, N2 z- r7 j5 o
void GPIOBankPinMuxSet();
' ~6 ]' p% ]4 v$ l# `0 N5 y- f
0 W' t1 g- A4 w/ ]2 t2 I5 R// 产生波形5 g8 D  c" y( o- [& W; z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 S  y( C8 t3 F9 V& `void ChopperWaveform(void);
( N9 l4 i  m2 W/ v7 Q4 _: ]/ E0 A7 `0 t0 c2 o2 d9 I2 u
// ECAP初始化和读函数3 n- w( x" l+ |# P
void ECAPInit(void);
9 A( s7 e4 ?- U6 K( L4 I8 `1 yunsigned int ECAPRead(void);2 z% {. j" ?6 q% N) q9 N1 ?
# ~8 v) T  f( ]
//ARM 中断初始化
- {- H; c0 b2 X" ^$ P4 l+ O9 {- ^void InterruptInit(void);- C+ B) T" T* ~; ]) n1 Z. q6 L9 W5 G
6 _% P7 V3 f  x
// PWM 中断初始化
. q# _8 S( t/ Zvoid PWMInterruptInit(void);
( |+ r4 F: K* Q- f- j7 U# X: ~" M// 中断服务函数
8 _3 D5 k+ C; [2 d// PWM 事件
& \- |6 ^* z/ Q3 F9 L1 t  Kvoid PWMEventIsr(void);8 c$ A( c8 q- g
// PWM 错误控制事件
) x& i" O) ?) i: y* m3 k! P) z' }void PWMTZIsr(void);
0 |" b  S0 m8 T8 u$ |; `/ Y" _
6 O- z$ P" }) h6 T0 @3 L) O+ k/****************************************************************************/
5 c& s/ `, k& r, F. \: P/*                                                                          */! E# F) w0 ]2 {5 `5 M: B" [& j' F1 i
/*              主函数                                                      */
0 Q0 \: O9 w! m# e0 |+ t8 X9 q2 V/ U/*                                                                          *// F6 @6 |+ l( Y3 @6 W) `
/****************************************************************************/7 \! d( w1 [( F& ]% i; ^
int main(void)
/ n( m5 ?6 A: V  n6 e* i{- T! l6 C- F1 f3 y8 [, W. v
        // 外设使能配置1 _' n2 M/ o" y4 q$ H0 w
        PSCInit();
3 s/ t  f& w0 \6 \5 i3 P  Q
% {# L4 L; {2 g% O% @        // 初始化串口终端 使用串口20 F/ ?  a4 N8 E; X9 L3 a  ]/ S$ z+ s7 c
        UARTStdioInit();2 R: C6 V4 E& k2 k
        0 d# }3 L6 m$ n- z; V$ B/ i% k9 x. Y
        // GPIO 管脚复用配置) P& ^$ ]  j/ @
        GPIOBankPinMuxSet();+ w( j* s, t3 s  e, @, O: Q( X

" e# }, n1 q2 |9 g5 ?% p        // ARM 中断初始化
( S" v( I0 a! f: h        InterruptInit();
* x& L$ A: i' U2 ~
& m+ g; q" d. C8 ]& m0 [0 b; h        // PWM 中断初始化
$ i: Q6 _3 Y0 y: q: l# D3 |        PWMInterruptInit();
4 {3 j; r/ s* j. U' D6 @, O
. v* ?( i& X& U1 S7 ?$ U9 C+ C        unsigned char i;
* F" E' W$ P$ |5 l: M        unsigned int j;
+ P; q) P2 n; p' o; e# z+ ~- F' g3 W5 F4 ?! s' }4 l8 p
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( P. f: b. U; f7 h! n" }        UARTPuts("------------------------------------------------------------\r\n", -1);
- F+ b, S, ~( S1 s( I% |9 W/ q# f) ]  X* X6 x        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
5 A. z" |$ ?) {3 J/ H        // 产生波形1 v% ^7 S6 C6 ]2 M- ^8 w
        PWM1ABasic(25000,50);; ~( l0 r; N, e
7 K! I8 r; o4 R
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
7 `2 o$ r+ r7 E5 [( v  D& D        UARTPuts("------------------------------------------------------------\r\n", -1);
: v& K/ C' A. b. M+ V% K  x, l; E' D4 Q% }$ }
8 R6 Y/ Q; p8 {  X. z

% i. Q/ l# `% k8 s        UARTPuts("------------------------------------------------------------\r\n", -1);
' x' b  f! h# K$ W: Y# B        UARTPuts("                    C6748 ECAP Test\r\n", -1);
5 Y4 w3 P( I( |# [        // ECAP 捕获初始化+ C" P" |+ U2 P0 ]9 I( m4 S
        ECAPInit();
0 G  H% M% S& n6 F* C        UARTPuts("Initialize ECAP.......\r\n",-1);. h3 W7 b; z" a7 E! p
        for(i=0;i<5;i++)
1 g# q0 T2 I! e) }# e* U1 F0 q& S        {
* }# ]9 B" Z- y3 D2 J8 v$ d! A                    for(j=0x00FFFFFF;j>0;j--);            // 延时
9 C' a1 x& Z( B                    ECAPRead();
$ l1 ~5 ~% e4 e" v, C1 t, i* k% E        }
4 V" B5 l) Q- ^! y# b7 E        UARTPuts("\r\n",-1);, d$ y3 ^7 n% H5 s2 L
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);( f: m% F1 R2 Y4 a8 R: S
        UARTPuts("------------------------------------------------------------\r\n", -1);* M, n; O2 h, S3 K6 J* L* |

, {  y; I( X& s% l8 R: {  v        // 主循环
: A, ~! N; a! c. r# i6 q* X        for(;;)
% |( }1 ^. A2 T- T3 @  n. h5 t        {/ i. O, d! n5 Y& @9 N1 [8 [
& j: \( @( P7 v1 a# e% J
        }2 u; H  ^: i7 V; M2 ?- N
}4 S7 I" p1 d8 L; m

! _& H" e- b' }/****************************************************************************/- k3 W+ i, n9 ?7 k1 b6 s
/*                                                                          */, N& P0 W( W4 G2 I+ p2 \
/*              PSC 初始化                                                  */) d2 w) T* `$ U. |) t/ y' f. P
/*                                                                          */9 K5 C5 j9 C; |5 F0 t0 c. w+ `4 W
/****************************************************************************/
: U" F( h. B7 Q. J) c& Svoid PSCInit(void)! E* j8 L' j0 j1 ]
{
( I9 J1 X) s  e$ J. B6 i        // 使能  EHRPWM 和 ECAP 模块  Z( q& R& Y1 o# ^0 L. N
        // 对相应外设模块的使能也可以在 BootLoader 中完成' n3 P! D8 \# ~
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 R  r4 ^) `9 @$ I* C
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);- c% l) g3 {) U% E. N
}
" ~. e6 R" e$ Z* H8 F) f
5 K$ ]) z# b& C6 V' @& Z/****************************************************************************/
" k, t! O; |% D9 `8 n! t/*                                                                          */' l* u4 h3 T% h) D2 d
/*              GPIO 管脚复用配置                                           */
/ v7 E6 Y' e4 ?- F+ V/*                                                                          */# U/ y" J* h3 a
/****************************************************************************/
" }2 U- P6 H0 u5 W) _* k2 Dvoid GPIOBankPinMuxSet(void)+ w, {" F/ I) W+ e5 H2 T$ b1 O
{
: D* a+ c! o1 k0 d/ o; ^! \7 y' I        EHRPWM1PinMuxSetup();
1 R4 n; p, Q9 n2 ?6 Y3 Y  T; v) _: Q
+ M5 X0 K! L) V) V* n4 |) O        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 {6 {2 R8 d0 b. u* P        // 作为捕获功能时管脚方向为输入1 l' _3 T" T; H+ v7 ]' K( B+ \3 ?) l
        // 作为辅助脉宽调制时管脚方向为输出) D( J/ R5 d. o7 g8 X- _- }  n# K
    // ECAP2 / APWM25 ^- z7 F* n% u: M1 z3 q; D3 |
        ECAPPinMuxSetup(2);0 t& O% R7 T9 @( r; I3 D

) \1 ^" N: e/ c1 V) E- C        // ECAP2 / APWM2方向设置为输入' `1 Q% \$ s7 o- L2 C  H, i
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]. O. H& F$ v) {; y
}
9 m4 |' f, w7 B1 k6 z1 r% l  q4 n
/****************************************************************************/+ g0 f. ~- m' @* l$ q; a3 ^
/*                                                                          */8 d7 d9 E; C2 D3 S! h* f+ g
/*              PWM 输出波形                                                */
7 ^, z3 O8 @& ]+ v7 y/*                                                                          */
/ ~1 ~4 ?5 ]* w  l: g/****************************************************************************/. q7 m/ N$ o# `8 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ o0 e  R6 z& d/ U{! V* f, w* @0 v) e$ C7 i
    // 时间基准配置) I: A# q4 t4 m  [" ?/ Z8 f4 Y, A
    // 时钟配置
# h# h* m- c, X! l  i1 A( q    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);8 C, d6 w/ |. C
7 k2 H$ R& M) p
    // 配置周期
/ }- E- D' P" l$ v    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,' s1 r: M9 L$ b6 A: b9 [0 }/ }+ E/ B
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);) X: q; d0 Q5 P6 O$ |& h
/ t; w# j; i. X& {
    // 禁用输入同步信号
- _* S/ x+ C6 d# r  f% `    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 x/ W7 J& f+ u! L" T( A4 a2 y1 b& a/ S# R! X
    // 禁用输出同步信号( K% U% b# v: s$ N1 n7 B8 t/ i
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);, k8 r* o' f5 G# o$ B
5 O$ c- n* ]+ b- U+ ^% i
    // 仿真(DEBUG)模式行为配置/ r  n9 W: C; n6 ~* E
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! F7 Y( H. @, L  f+ s; Y
% w$ X, |4 i% G  l0 m- \0 u8 B; [    // 配置计数比较器子模块8 i. ~, U; j( ^5 E3 f, M2 ^
    // 加载比较器 A 值
" ]6 y6 W! j0 X# l' Z    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. \% k: L+ W' E, L                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 G0 T! M: ^  `' q( c
& a, X5 Q4 Q9 N7 F
    // 加载比较器 B 值
/ ~& C5 a. y( S/ R    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 p  w( N8 M. L! |                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);) Q; E& F; F. H1 R8 e

! C* p" \1 x" f. H: n    // 功能限定配置(输出引脚触发方式设定)7 I( D6 D( k2 I
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出, r0 I/ D* L$ g' }; W, l- u
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: Z5 o( e) U1 Q- I: D' G) D& K3 o  ?2 |                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,: e! K5 N' i' @- r! g
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
. z5 H$ m8 N0 ], G! ?
/ P9 k9 b1 S- E$ N    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
& u( F5 O  z: {    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ |# |- T. s4 l5 y  O+ o1 h3 q( i0 \9 F
    // 禁用斩波子模块/ H4 I2 F, a' s, o5 L$ v
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);8 U' M% b: V* I/ D9 V" F$ [

: x4 L$ H  V) r( w6 Q7 y: ]4 m0 g    // 禁用错误控制事件8 I& `( f7 x9 B: M, y
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);: p7 F4 I2 d: r8 s/ y
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);8 T! V4 C0 b* E

$ q1 d8 Q8 ]+ W+ W6 T    // 事件触发配置
+ W4 E9 ^' c* W4 x- n    // 每三次事件发生产生中断
7 c$ l: K( [: |7 I; J    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);0 |' g4 x1 G. `- e
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 |  W" }: A% x7 `$ n/ k0 {5 e
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; g6 S# _0 v6 t5 x4 _7 o) e    // 使能中断3 Z! f$ G% x2 C! m3 k# M
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);' B! f/ y! v1 r( T, `
* F8 N7 L" f& F( n6 j# d( r" _3 ?# o
    // 禁用高精度子模块
+ t' A+ C, N1 T    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);& D2 d5 N% ]% B3 `

5 U$ J6 l  d6 q4 a6 g    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);  w% x6 Y9 V( `/ b, s# T9 R8 I
}
3 j; E) p6 b; }5 v( `  Q( M7 p0 _  ]6 ~7 W1 D
void ChopperWaveform(void)+ j5 T0 ^2 w* n5 Q. E& F
{: V# K+ z- e$ b% M: M$ k
    // 50% 占空比
6 L5 o  ~* f5 x! o; P% i: Q9 ^    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; B, b3 X7 _/ n6 a4 G" c    // 4 分频  a5 e4 I5 k" `. Z" V( Z/ o0 V, T
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- E/ r* D/ R1 Z# M5 `8 @- R
    // 单个脉冲宽度
7 k% s" T) ~% Z4 L$ v% ~3 k    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 R1 A$ v7 l+ P" n& {    // 使能斩波子模块
# P* x. J$ Z  }! C: s; ?    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);% j0 t% d- r; R3 J3 S: r
}3 h- x; {/ a6 A1 k: Z

3 x# X( d& N- ^. |3 J; [) a) r6 U! R/****************************************************************************/
  m% ^* H) m% z( a( F. c6 q$ j/*                                                                          */; A2 o: c' v3 b8 q2 a
/*              PWM 中断初始化                                              */
- ~7 `/ S8 R& }+ M/*                                                                          */
) h0 ?, j' p& Z# ~. d- b; @/****************************************************************************/* R8 a, X( P9 l4 U/ i
void PWMInterruptInit(void)
" P- |: O/ A; S. c: a{
: I" d" v% k, m6 Z        // 注册中断服务函数
: i  I/ v' n7 M3 r2 g- |& ^        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);- `6 R0 {1 D3 T7 q
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);- u/ M; I8 @6 y1 M6 o) u. @1 r

/ E, z, \# r) A* O3 q- E" p        // 映射中断
1 l# N2 R( n( }  I) i% e% {4 l        IntChannelSet(SYS_INT_EHRPWM1, 2);
  ~& S: n8 h) p7 b        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);0 B( I% |; ~0 y) Z
/ z0 @7 D7 X# u, J# [6 A- G
        // 使能中断; j" \) M! V+ }8 j
        IntSystemEnable(SYS_INT_EHRPWM1);
0 T& M* C7 B  G" E9 W( m+ z        IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 T% n3 S/ \: b5 l2 g5 s}
9 Z% ^2 U5 a: x. v
" t5 e) N/ j8 k3 m+ {1 B) T0 s+ a/****************************************************************************/
6 T& A1 [$ h" d; O# I1 z) v: a: d- @/*                                                                          */9 b" N, N/ {( k; `
/*              ARM 中断初始化                                              */# H, d7 t, f4 ]3 T# s, r
/*                                                                          */
% [/ a7 _$ d# c9 w0 i# A8 w2 {/****************************************************************************/% [7 ?6 u% B5 n4 w7 K9 c, }
void InterruptInit(void)* i. w9 i  d* R5 p1 Q6 V
{
; T' R* Z( J- d5 p        // 初始化 ARM 中断控制器
6 W5 M' H. @5 p& O: Z        IntAINTCInit();- ], M, c, z# g! F  i3 \* b0 |5 t
6 s& u0 U  @' r+ X# T# h
        // 使能 IRQ(CPSR)
5 A, u2 W! |/ l* B- G2 w        IntMasterIRQEnable();
8 W2 s( ~. I+ D- s% D1 }  p
$ c( B& @. }1 Q* i7 b/ r        // 使能中断(AINTC GER)
' Y8 \0 |" e2 P9 h0 z        IntGlobalEnable();
5 U  C2 J4 f- f# q4 v* F2 L' l& a- S" c' h: E
        // 使能中断(AINTC HIER)8 ]/ t6 p/ i8 {; M$ K
        IntIRQEnable();
/ W  ^" q5 P) n. e}
# ~1 i0 d( @, i4 ~1 j4 D8 j4 `, N+ Y# g

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
$ q0 t& ?9 X, m. I/*                                                                          */
$ Q& M* c) U' F0 s' T6 J/*              中断服务函数                                                */) ~) E. P4 b2 H
/*                                                                          */
3 x$ h6 T" b6 o( q+ z6 m! b2 v/****************************************************************************/
& d0 x% [! R% G$ t* Rvoid PWMEventIsr(void)* s4 J6 `$ R) O2 ~* u
{
% ^! d4 k. g: @) o        IntSystemStatusClear(SYS_INT_EHRPWM1);! G. E- K  D6 N) `# [6 o8 z
0 M/ c2 T; ^# W8 N
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);& H8 y( C8 M0 A; a% p, r. P
}
3 g) B* S1 K4 |0 N& S
& Z7 ]' ?7 ^4 |8 A1 Xvoid PWMTZIsr(void)
5 ?- d$ @' D6 |0 N4 g, }" Q. H{
4 [% Y4 I3 |3 g- }. ~+ y" X" _& z        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
* `* b+ T+ F' _) O) ?
6 K/ ]0 K# m+ c2 D% u    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ b$ f' p2 C+ Z5 R}" o! T& T9 S8 Y+ g

' s5 w6 I' t- F+ N; @$ K/****************************************************************************/6 C- g4 J  `% X
/*                                                                          */
! H7 G* i$ N$ |) ^7 g/*              初始化捕获模块                                              */
4 W" M" Y/ v- P0 R9 `1 e* W/*                                                                          */6 p# n2 I+ {$ v- @$ Z
/****************************************************************************/" d: c3 w0 S2 w6 J5 h* |
void ECAPInit(void)
1 e$ Q* V7 T) _# {- F0 Z8 W{2 J6 [9 L* G& g- x& G* l; E
        /*-----设置 ECCTL1-----*/$ ~. V5 e9 m5 p3 f+ e- c( w  _+ Z
        // 使能CAP寄存器装载
9 L* z/ r: {6 ]" D4 k        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);6 d! R. f/ N" g8 a
        // 设置预分频值.
5 v' }4 V  A5 o5 q        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; ^) c  c" i: P% H  x- T7 e1 s. W  x9 [        // 上升沿触发捕获事件; c7 M% u0 o' T6 Y9 [
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& G- r: ]( ]* `5 Z, A        // 输入捕获后重新装载计数器值.9 X" }8 C# v* F/ n
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);5 A, t8 d8 Y; t4 T2 `  R. \
4 q' A$ r( S8 F5 `1 R
        /*-----设置 ECCTL2-----*/
( {% ~; e' C3 w. o4 ^" G# A5 q+ H        // 连续模式# G3 w& c! u) U8 N; k' A
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);  e1 ^* k9 m$ l) X* }7 k; Z5 O
        // ECAP计数器TSCTR持续计数
3 F8 w# V0 p1 z6 J7 H1 v! ]' p' ^        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);; f4 {: v: ?" D2 j6 H
        // 禁用同步输出和同步输入
" O! c6 y, }7 b) g        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);8 w! c2 @; l2 Q. R3 ^; z2 n$ k
        // 配置 ECAP 2 为 CAPTURE 模式! U& I0 w( }9 I
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);! J9 M( U% [/ F1 m( p2 K
+ S9 ]+ j" }5 }5 p6 R; ?! t
        // 使能中断
. i( E+ y' o+ R) u# Q; G0 I- o" z//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);# W1 b' o/ x: r# B
}+ D0 }4 O/ w3 e. ~* P* A: ~+ E# P

. g0 j8 T% u& B/****************************************************************************/8 F$ h7 c8 @) C/ |+ Y
/*                                                                          */: S  x# U1 C9 j5 a
/*              取得捕获结果                                                */, O; q8 K# B* \0 ]# M
/*                                                                          */6 e  I5 t- x  i7 s8 e2 p
/****************************************************************************/( k/ R. e% Z; Y$ G
unsigned int ECAPRead(void)6 Q# P% C6 d: |$ e0 H& A/ _
{5 J' D8 m' R; J* i: Z! n
        unsigned int capvalue;+ t$ O0 i2 M1 u( [; ~
        unsigned long frequency;
# h7 @8 h9 {9 {" U+ i3 W4 v  L$ g+ Q; U2 X# {% K
        // Event1 中断标志  Y+ Z! X- P4 `* ]2 H1 g- k
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
) @& R, E( X6 G9 p        {
/ J' G' v! H4 {; t, N$ S% ^2 d                // 取得捕获计数7 X* j" O  N6 x4 }
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);4 C% X+ _6 R( Y" a$ r
                capvalue = ECAPResult.cap1;
* r& c' i" e( Q
. B! |4 i: T3 K) L                // CAPTRUE 模块 228M 时钟主频9 L3 G  ^4 \$ o7 M0 y% h
                frequency  =  228000000/capvalue;
1 U5 |- ~9 A( c6 ]' t1 S- ], z                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
" a  l. P9 J& }4 o2 B, U! j# j) _) `0 c2 s/ E
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);+ {' m) ?* C9 P4 R. i
//                IntEventClear(SYS_INT_ECAP2);+ y) _8 {$ n* M9 u; |
        }
- U# m* x( N' W1 }' t        return frequency;- p9 S  m6 S0 o6 V9 X3 d
}+ W$ D+ W. t; k+ h

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。% m; s% \2 B% R  h% Y3 z$ p
[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