嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家; Z) Q& L0 I' E1 O7 B2 M+ ^

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/4 p. ~5 i+ d6 E9 G8 M7 O; M
/*                                                                          */7 ]* p" Q+ K" v$ c6 e3 L% s
/*              宏定义                                                      */
% A9 T. _; y! k6 u9 A/*                                                                          */& H) \) i7 x- A- k
/****************************************************************************/
# S9 G3 i; ^4 x9 g// 软件断点
1 ]8 J  z! U- F/ ^- [#define SW_BREAKPOINT     asm(" SWBP 0 ");; y  f2 P/ s8 a( G, ^

0 N" \1 K! R0 \# ]2 I# D/ p4 H( z- }// 时钟分频& y. i  x# _( k+ j/ {. \) b
#define CLOCK_DIV_VAL     228
- l$ o! x2 r2 h
8 a- r$ W4 q/ B4 a6 x' S( r5 b/****************************************************************************/
7 W1 ]  u+ H1 N/*                                                                          */' B3 \( H, N% \! I* ~# k% x
/*              全局变量                                                    */
2 U% j6 z* ?/ \8 R' v/*                                                                          */
, f. K& L, p/ u* f/ P7 I$ F5 \/****************************************************************************/
3 l1 m, |( {* b! R# i( s6 vECAPCONTEXT ECAPResult;
4 U5 U6 S, U& O) d/ O( Q$ g5 t
6 {% C; y: N0 U0 d' _/****************************************************************************/+ W  j% G: s5 N+ h. `7 I! X7 w
/*                                                                          */
7 F. j  v( ~+ f; ^/*              函数声明                                                    */
' F& i( F+ C' P" G9 l7 d, P/*                                                                          */
) l8 A. p; ~/ ~% d1 P/****************************************************************************/
! P' |; H2 J" |2 }// 外设使能配置
9 Z" T2 h: {' H0 {  }( s8 Mvoid PSCInit(void);
  f/ X% X  x% F& m( E; m% T  `4 O4 W8 g4 h- T/ \
// GPIO 管脚复用配置
% S: w% q' Q4 W: d) V5 B$ Rvoid GPIOBankPinMuxSet();/ e; k) |1 M, F9 I  P; W

# S" S8 |/ Q; K8 `" h% |0 T8 ?# N// 产生波形! i- E: f, A" m6 y
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
+ g9 }$ ?6 t4 p/ H+ n( _void ChopperWaveform(void);, x/ L7 h( N% u# J

/ n5 X. m+ y3 N4 _4 L// ECAP初始化和读函数
: ]% @* ~: S. r  q1 b9 A  ?void ECAPInit(void);8 v. ~# j4 G7 r) ]% g
unsigned int ECAPRead(void);. {. ?3 v% Y! b
. \/ s% U/ G) P# f
//ARM 中断初始化
4 P# b  w! d6 I2 R- bvoid InterruptInit(void);
0 p. X* `' Q+ Y7 s7 G. F$ P5 ?' x. K' @0 o. ~) Z2 ?
// PWM 中断初始化
5 H9 p( Y% {- y. D/ Svoid PWMInterruptInit(void);4 P) Z& ]' R2 E7 s
// 中断服务函数+ Y" c$ J2 x; ^* u
// PWM 事件
( T$ R) b( ^' ]/ a( a+ W; [/ Qvoid PWMEventIsr(void);
) U# y) v3 v" T* |- \% R// PWM 错误控制事件
* d. j& W; c) G" hvoid PWMTZIsr(void);
4 J' e: D( [% a% P9 X. f
8 w  X: v3 c3 E' W/****************************************************************************/
4 M# B; |0 m& x% b8 {' L/*                                                                          */% i: |9 }/ E8 v$ q' c
/*              主函数                                                      */
, G( _) i' h8 I% I& F+ ~8 u# I4 c% d/*                                                                          */
  N% ]# p. }0 z; u+ @5 w/****************************************************************************/
) h. C  \+ Y, D. B$ ~( gint main(void)) \3 B! x. L2 C( j  F
{
/ r; U1 ]3 c$ {/ e' U0 J  S        // 外设使能配置
% B- E: e: B; r, N        PSCInit();; F; Z7 \7 P/ g# }! [1 z
6 _0 Q3 g5 g& ~* _9 J
        // 初始化串口终端 使用串口2# o7 W! }* m0 X# M6 i0 `
        UARTStdioInit();4 o& B7 U5 o5 l6 j  G9 j
       
+ D7 N/ H* G' D+ o        // GPIO 管脚复用配置0 h  R+ H5 d/ Z( e' X) z
        GPIOBankPinMuxSet();0 S$ u$ A3 A/ \2 Y1 K: `; [! G2 R
9 `" N) r) a9 }5 C
        // ARM 中断初始化9 q( y( ?! R" X6 ?- Y$ z, v
        InterruptInit();( p  V3 X( I8 J+ j6 t& e7 [; R

, @6 V9 L) G9 A0 O9 N# B& T! a        // PWM 中断初始化1 ~- ], q: H9 F# P4 B
        PWMInterruptInit();
3 ~9 U& ]( L- l; a- e& T! v# |7 R. p3 U9 {
        unsigned char i;5 o: W1 H! J' L1 q0 q. {  h
        unsigned int j;
3 S8 ^) C+ H: u0 Z" b& W# G9 j' O, r* ]0 B+ s( G: u1 d
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& i" |* y% J( U. q0 i" G& N! @  ?        UARTPuts("------------------------------------------------------------\r\n", -1);
2 z  E/ y  [# v  m0 J6 C( u        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);' `2 R& n$ @, O5 [+ a8 o
        // 产生波形5 N3 i. T( {! y3 U
        PWM1ABasic(25000,50);
( @% F( s3 H* h* h! S' Q. M% N* W2 C' c1 i
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);9 y# U6 K. F! y0 q% O1 C
        UARTPuts("------------------------------------------------------------\r\n", -1);( J. z0 @8 O0 V: E- s$ e

5 D  h8 ?% }, B+ Q' X0 n7 d  b$ J! S7 \, k* c2 S8 U+ a3 s

7 T# Q2 n3 h6 ?- v        UARTPuts("------------------------------------------------------------\r\n", -1);
* z4 [2 \  L/ E" C8 @4 C8 l        UARTPuts("                    C6748 ECAP Test\r\n", -1);
0 w- i' M/ s: F- P/ H" {7 D& s2 \$ A        // ECAP 捕获初始化
4 S% W( E8 l5 e6 j2 f6 y( f        ECAPInit();. A: b6 }; r( N
        UARTPuts("Initialize ECAP.......\r\n",-1);
# t6 }2 O8 O; o7 O- N        for(i=0;i<5;i++)
  B1 G( C+ n! ?* e/ G: ~/ t* r        {
) Y; g$ a0 `8 |' ^7 [  \2 j6 e                    for(j=0x00FFFFFF;j>0;j--);            // 延时
2 y2 ^/ i1 q- L* @; e                    ECAPRead();( a9 L  w+ W  D9 Z
        }# R' g+ x* n# R: c7 k% u5 \+ q
        UARTPuts("\r\n",-1);5 S! k, x5 X* ~4 Z6 _
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
) [: {/ r) Z2 h: O. ~        UARTPuts("------------------------------------------------------------\r\n", -1);
* C5 c" \, S* h0 S
# I6 _( W& E, }' m" J        // 主循环" C8 i' l) F7 I9 O" Q) u
        for(;;)/ K2 _: x$ e. p3 p3 J
        {, |! c) L9 F* Y+ d9 h3 @! Z
' `1 i) L- x2 P, \
        }
7 Q% f# w8 X1 b}; D  c, ]& |8 l/ i
% y- \* n* ~7 d* M' o
/****************************************************************************/& p4 r- Y9 ?2 X0 D7 X5 Q' I
/*                                                                          */( C3 r4 M! P# B7 B0 j& G% w3 i/ x
/*              PSC 初始化                                                  */
9 s. Q- t" P4 H' x7 h6 M* H* L( g/*                                                                          */
, M* K% [9 m8 L4 B' L) @  ]/****************************************************************************/
8 S/ V  e% u( a- ~& Bvoid PSCInit(void)5 C7 M! a, _9 J
{
5 L" `1 N2 D) G/ S( |, r        // 使能  EHRPWM 和 ECAP 模块
6 s( n) `/ x* A  U/ b, R        // 对相应外设模块的使能也可以在 BootLoader 中完成# p3 `) D" B1 X/ l9 @3 w/ m
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 u* a& b1 ], \; N" q    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 H; B: S% `4 D' \7 b, n7 h+ L) p}
9 E. V$ U8 f5 h( r4 ?6 ^0 x! M0 f6 J1 \2 K' M
/****************************************************************************/
" M# @1 O# Y2 o2 K/*                                                                          */: s1 F2 J- x3 D& Y3 M
/*              GPIO 管脚复用配置                                           */0 ]; G! R4 H" m. ~
/*                                                                          */
" |) B3 ^' S4 p4 C  n1 X6 j" W" A/****************************************************************************/5 `0 o: h# s  `( {" T* M
void GPIOBankPinMuxSet(void)# o3 e2 ^5 L4 o4 m5 ^8 q
{5 N* g  a7 L6 b
        EHRPWM1PinMuxSetup();4 [& ]$ f8 L0 A; F9 i' A) l  C
2 d; M' u  y. Q1 ^7 p
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ z& I7 F) E+ z1 p2 C
        // 作为捕获功能时管脚方向为输入
% ~& L  i5 ^0 a* e0 y! \( }        // 作为辅助脉宽调制时管脚方向为输出
4 T# X( Q$ m" A: Y8 M    // ECAP2 / APWM2$ Y* D. t( R" t) ^1 S3 |. t
        ECAPPinMuxSetup(2);) N3 o( J( i  \9 C: Z' w3 u

! ^& R& a2 I: `- x4 C1 N        // ECAP2 / APWM2方向设置为输入4 T& c( X3 m3 p; Q, T
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
8 ]2 A8 n% D( r* \}
6 p7 l" H! f* E! M/ H/ j* m9 q$ D4 Y" }
/****************************************************************************/2 {" d6 k4 S2 v" U
/*                                                                          */' y; R3 r; c2 i1 V4 E, \1 p
/*              PWM 输出波形                                                */# b5 r4 j! ^; w8 X2 x
/*                                                                          *// S) q/ @+ f0 Z4 i! a/ y& Z
/****************************************************************************/4 c9 ]! X, z- s" p0 Y+ |8 c# Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)1 H! v% a. T0 P* s) `
{
( R4 `1 y3 J, L- K    // 时间基准配置5 S1 z: ~1 F1 o5 ]5 W+ l! F
    // 时钟配置  @, y0 @% ~. C
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);: K+ ~* ~  \+ ^. F+ u. d; T; l

8 T; I& l! |/ Y6 r7 r    // 配置周期2 i  |& k$ W0 h/ T( D
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,% E7 }0 \: ]# Q" a
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
6 I; _/ k+ l8 d
: O  K, i' B- x* Y; K$ V  ~# k    // 禁用输入同步信号
& @0 X1 A4 o) X) g6 Z    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
' ]4 a' g' @3 q+ x
. c% O, `# r: W3 |& U3 _    // 禁用输出同步信号
( c8 E* x; M( b# u% i; H    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 g( U0 N8 U6 W$ B+ D" m7 G: U  F+ Q  X9 h2 W2 z
    // 仿真(DEBUG)模式行为配置
% [' b  F; N/ L0 m    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 x! R% c$ I/ R, G
( Y( q) M& Z1 L- V0 T9 Q    // 配置计数比较器子模块4 |  ^+ \/ f; M: X$ V" q2 s4 _( q- `
    // 加载比较器 A 值/ y) d8 B' {" N. r
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,# G) E/ v( _" _5 g: {
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# p6 R6 S# m3 ^' {* \2 E( p2 Q  t$ t$ U
    // 加载比较器 B 值
6 ?* `8 d/ N3 O% X: K    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
, x" S* O$ G1 T# d5 K                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# w- B$ P( _4 r9 y, ~2 d! ^- q& c8 L/ p% N3 }) T
    // 功能限定配置(输出引脚触发方式设定)( ^' t4 z0 R. u* b  j& r: w
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 n; u" ^6 h) _5 z. l  z    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
9 }+ j- B& |/ Z- r& w; }9 I$ V- C                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,$ w4 \+ ]8 G& V9 z; Y7 M
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
9 F% [  t; R5 L, v4 u' I
7 v+ w/ {! H' }    // 禁用(旁路,信号直接输出到斩波子模块)死区模块) i; H8 ?$ L3 }3 A6 {2 w1 H; l9 }
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);/ ~5 _  F7 R3 U4 e3 H8 b
2 s- |4 m1 t; x/ o
    // 禁用斩波子模块  S! n3 o- [5 `- h# I/ c
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
' [) L1 y3 t8 n
2 u! W: W2 q/ ^3 D& X% v( M  f    // 禁用错误控制事件
0 v7 h8 [: x) i' R. t% i    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
" z6 S2 t5 O! V: f0 ~7 M    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 u2 {9 |: V+ [3 I3 Y; U$ V% |' P- i
    // 事件触发配置
$ X% t) e$ i2 E* I# g    // 每三次事件发生产生中断! S1 a& T) ]  K! G& e
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);; z' h) v% Y' b  j; y; ?+ j
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件4 G2 c( Y, O$ ?5 a9 z" @2 |( W. M
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);4 M+ H& a6 G2 t8 b3 U% m( J
    // 使能中断$ b3 R% M+ F, n6 _
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- Y) R, \5 P9 y% |" V3 L% o

$ J) p' V3 d  V" g( ?! Q* |" C' I; p    // 禁用高精度子模块
3 }7 g& ?1 ?; p2 a& {    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);$ p. G7 ]( L7 Y5 P2 m1 V5 c* i0 F

  K8 V9 @! ~3 z! o    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
( ^7 z; p' Y) b' W2 c% H+ c}: S6 ^0 {; \: ?8 x9 _

! o1 N9 n, |7 ^8 Qvoid ChopperWaveform(void): g& w, R4 {- o1 D/ `+ |. b
{
6 q/ o- V2 R$ _7 o( k    // 50% 占空比; d& s3 Z0 {& X) {
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
7 o  g+ C& [7 p8 w$ A1 a3 `0 S2 m    // 4 分频8 w  Z* {! a5 l/ f: ^" p
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# W* R: u$ @3 y% J+ P    // 单个脉冲宽度
* j0 \/ j: N+ ~$ v5 ]    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! T. b$ e" y+ f/ z  `4 o- }    // 使能斩波子模块. W4 k, Y( i) k8 g* o1 c
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);3 c* I" k, T2 U8 k( U
}0 W; {3 T2 |) x  C+ F

9 z$ t- Y( x$ n  X, i( K; s/****************************************************************************/
0 K3 W# H$ ]5 t2 u/*                                                                          */
8 U  a& e, ~; f. h! k/*              PWM 中断初始化                                              */
# Y: a/ q- U7 A0 s1 i) q9 O9 N/*                                                                          */8 |+ v: j! p( j8 O/ p" Z; o/ E
/****************************************************************************/0 G5 r1 P/ l' n( o) w! t) p3 E# \
void PWMInterruptInit(void)( V" `$ a# h1 |
{
( v' G$ ]5 `* ^0 k* T7 a+ b        // 注册中断服务函数
: X; ]# O$ K4 H. E/ X5 {* r        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);$ j, C% T6 _: O
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
0 s& q5 v0 M, x' P+ G% o# x6 I: d$ l( r
        // 映射中断$ X  e; }0 s4 ]7 n: k
        IntChannelSet(SYS_INT_EHRPWM1, 2);9 Q7 C. f! z$ k, Y, O
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 a6 l& e: A2 C6 m) g, c" W/ y0 I' n# X' w% N
        // 使能中断
5 u7 J4 w3 s0 r* }. w: K        IntSystemEnable(SYS_INT_EHRPWM1);6 d( b5 h8 y6 Q" `9 x! @% {7 C
        IntSystemEnable(SYS_INT_EHRPWM1TZ);$ U  W' z  Q2 B1 s" l2 w
}5 H3 s1 w: B% i/ s- v- s
5 q4 i& m6 R* H; b# @
/****************************************************************************/
% Y. o3 ~9 ?/ H; v& _* H6 I1 o) o/*                                                                          */( w% Y8 P' r6 n# |+ \
/*              ARM 中断初始化                                              */
1 O: p. t3 ]. u' a7 T/*                                                                          *// Y+ n) `$ @4 O$ N
/****************************************************************************/
. x+ m# E" b6 Q2 H3 _void InterruptInit(void)
5 g5 U1 ?+ a5 D- d; p" a" w{- l. O) [$ X2 z/ ?# W
        // 初始化 ARM 中断控制器7 [7 F7 L0 ~8 F- T. ~6 ~2 F# n
        IntAINTCInit();
- F# t" k) P/ r. n# j
" D  c0 f) l! |% k3 d' \! t        // 使能 IRQ(CPSR)4 S6 {  M& R; N; h$ N7 S
        IntMasterIRQEnable();
9 f4 S& x0 X* C( N/ ~! e$ `: Q- M. r: C( B9 l# w/ m
        // 使能中断(AINTC GER)2 b+ e0 L9 r; J2 \2 Z# L! _
        IntGlobalEnable();+ w$ D. n2 c; `& d0 f: O
7 A- U7 z& f2 M
        // 使能中断(AINTC HIER)9 t& T1 i3 l+ L9 v" R
        IntIRQEnable();% s; K" ^5 Z0 P* Y# Q: _0 ?
}  q, ]! {" K6 r) }( U0 W1 G/ x
, Q0 \& m" D4 ]% ]2 M

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
1 q- Y# P# v# n, o/ b8 ?/ q/*                                                                          */
' N. C" S  p  h7 j$ V' F2 J/*              中断服务函数                                                */
  N( }+ o. ~# ~! A; b. I# L& `/*                                                                          */* g3 s! z- Q/ a" p( y
/****************************************************************************/, I1 p! W% t& q" ~" ~* g
void PWMEventIsr(void)
4 u3 q5 V) N1 ]% U{+ u6 y* f6 p4 p+ h1 o
        IntSystemStatusClear(SYS_INT_EHRPWM1);$ C$ Y9 g9 M, X! W) r
- B3 O' w, g% F
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
. ^& C+ u' S) u$ {# r1 p/ t}0 Z  z2 \% {# x; T7 e" p5 U" d: i
# y& a. W4 Q/ j
void PWMTZIsr(void)
! T' m/ C9 |: m" d( ?) s{
( R/ b5 j4 y- P  h        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);& O3 q3 `! n& a
, ?, y- s$ i- g+ I- ?/ j' A
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);' Y. }& R3 \! Y9 k8 \
}
# P% J5 e$ z0 B! f& ]7 Q$ q4 C9 e, s+ p: @) z- R4 T
/****************************************************************************/
. u  ^) w0 ?4 W( \/ M3 U( U/*                                                                          */+ C3 U& \% ~/ z1 m- J
/*              初始化捕获模块                                              */4 u& q8 C9 }% E* m
/*                                                                          */8 a0 z7 R2 e. M
/****************************************************************************/
' a) z/ k4 z$ J2 bvoid ECAPInit(void)
9 P! s' {; m0 x{
* V/ G6 ^4 k5 v* f9 _        /*-----设置 ECCTL1-----*/
% B$ {' h1 {" F& y  H2 L% W  o        // 使能CAP寄存器装载# x) u& H+ H( z. X/ |/ r
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
3 @! J5 c9 c4 Z, P0 k) C8 N7 G        // 设置预分频值.& Z' x/ @) [) Y2 i9 g8 V: }
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
( g" F7 w, p& Y; ^        // 上升沿触发捕获事件4 e# y0 x6 M% a" U
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 {- B3 }7 \4 ?2 V0 l/ k8 m  w        // 输入捕获后重新装载计数器值.
  i! X( o8 i8 H# C' V# i0 V7 C        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" V- u9 F1 t7 {. ]8 ?8 H( P. k: d5 s, {! w  y
        /*-----设置 ECCTL2-----*/
- o) N$ t9 M# P( @# p$ G  i$ g        // 连续模式# w  w3 g, B; _0 T' |
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
2 _( }6 ~  h! R3 q, I6 J        // ECAP计数器TSCTR持续计数; ~' t- u4 F  W6 }$ i# r$ H
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
! y6 X! w$ A6 E        // 禁用同步输出和同步输入& k0 d! _: l# h( K
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 q7 g4 ], a/ {9 t& ~+ _        // 配置 ECAP 2 为 CAPTURE 模式
( J4 E" O0 r, o+ D, z6 U+ c- x* O        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);, y6 b# f, G6 W! ?, m3 Y4 M
% A4 X1 A* x4 m
        // 使能中断
  {8 I9 f1 |; Q* w  f//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
7 S. }1 F) G' Q% K; Q( O}
. t, o  V- t9 |1 w$ V; y% p
9 u9 b$ a) D3 d8 c/****************************************************************************/
5 k+ o1 I4 H; ?$ S# w/ F/*                                                                          */
% j" I0 G: U, ~: h- A7 n/*              取得捕获结果                                                */3 H- [+ w, W3 ?! }* @& I
/*                                                                          */9 B0 ^* C$ j8 r! ~
/****************************************************************************/
4 T/ N; R$ N' g2 nunsigned int ECAPRead(void)
5 H/ q8 ]3 t: U) t, Z{
2 N/ C$ \2 f) F# O  X        unsigned int capvalue;. a# T4 B1 A  B# ]% |, G/ b
        unsigned long frequency;
" x* _( ~3 ~- Q9 ?2 z* p1 N6 }8 O; C" V
        // Event1 中断标志; F- ]& D6 P* v) P
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
& Z5 i/ m2 S9 b9 u! U' G% r' o% D        {+ R# q: C5 o4 |# v5 P3 Z' H0 L
                // 取得捕获计数
* v; S0 \" E( a$ F+ h4 r! u7 ?. X                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);' [  z; Z# x/ X7 B
                capvalue = ECAPResult.cap1;
3 ~" s) X8 q. H8 A3 z! O+ T8 z- m. K$ i5 U8 u. w
                // CAPTRUE 模块 228M 时钟主频+ t+ l- }& t/ x9 T6 W
                frequency  =  228000000/capvalue;
. d$ Q) a# n: H  `                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
6 t, v: R* |/ y7 X* y/ ~# e! U; d; ]5 ~7 P
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
. w7 c% f5 g7 d6 Z1 d" K$ t) n. f//                IntEventClear(SYS_INT_ECAP2);
7 F* n# a& @2 \- y9 M/ o        }4 v0 G4 L" p; H# Y* p
        return frequency;$ ?# C: p# _6 E( a9 N" q, S. H& Z- c
}
% B2 A/ f8 k$ p; h/ H; G, n
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。+ j5 O1 [; U6 J3 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