嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
# h$ B- c+ K# y+ j
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
8 A4 W$ F* X8 e4 t) k/*                                                                          */: X7 m5 [* h0 s$ c1 m$ [) I
/*              宏定义                                                      */8 N9 Q& R( f6 ^3 w9 u
/*                                                                          */
& E+ c, k! b8 \$ w3 X/****************************************************************************/6 s7 ]5 X4 m' e  q! v# x" W
// 软件断点8 ]% o6 M8 G4 v1 t3 P
#define SW_BREAKPOINT     asm(" SWBP 0 ");+ n* u2 J( `' X' j! B3 n' o

( k3 {& V6 a3 M) M- V: P; [9 g! m// 时钟分频; H1 F. a6 Q! a) U
#define CLOCK_DIV_VAL     228% H+ ^, i5 U% ?' G  C

: J+ w( A: R* ?/****************************************************************************/$ c/ o5 k' K* a" W: n$ F/ ^
/*                                                                          */
) C+ B7 _  R* z' V0 G/*              全局变量                                                    */3 R5 d/ ~, S; i2 H1 r
/*                                                                          */9 V! {8 ~2 E! |: ]# n: R# V
/****************************************************************************/
  s% F0 l# p! d$ B1 nECAPCONTEXT ECAPResult;% S! Y! N" z% o0 [6 V8 v/ z

  L/ ~  e5 B' n2 E9 j( j3 F/****************************************************************************/  V& {2 N9 B7 S1 M+ N1 Z# e
/*                                                                          */! L. g4 `5 ?1 n  V. r4 y
/*              函数声明                                                    */
, U$ ?. W' m9 t! a' P/*                                                                          */
+ C( n0 a3 a: T; L; g/****************************************************************************/
- `9 x2 b( Y) t) y1 L5 i7 v// 外设使能配置
+ @7 h1 r  Q  P1 C" V" @void PSCInit(void);$ x% \- |) \8 `- x8 X

  D3 q$ M+ V; M! o6 \: N. H# n  Y// GPIO 管脚复用配置
6 Z7 C  s+ ~1 v% s9 h4 \9 P: [void GPIOBankPinMuxSet();( J1 [: f& U0 d+ h% {
* k  s! O0 s$ ^+ J% {
// 产生波形
3 |5 v! Z; U, ~; I% _void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
4 j/ P( T( R* v6 y" ?' mvoid ChopperWaveform(void);
2 B) c" [/ H* D$ o1 ]4 Y( C
* I7 i- P& p8 G% o// ECAP初始化和读函数
) \1 p0 M* p3 j; ovoid ECAPInit(void);1 I5 W9 a3 ]- n' m  @/ H8 M3 ~
unsigned int ECAPRead(void);' a. X' a% J, h- D: ?7 l0 D

* R, f+ z4 i! P  T) t% ?+ ~//ARM 中断初始化
$ k$ \1 `, O8 p9 Avoid InterruptInit(void);9 e+ a! W6 {- ]) b3 I
. ^' \- r. ^: {7 h( r! x% h* v
// PWM 中断初始化: y! W2 n8 i* w9 @0 ?
void PWMInterruptInit(void);" j, k/ E" A6 W. r/ p
// 中断服务函数
! I5 y- }! A4 k$ m- ^// PWM 事件
! `% N/ T2 U! ]4 F: n: r: S* Wvoid PWMEventIsr(void);( a' L+ S) [& X
// PWM 错误控制事件+ S/ a$ F# @7 x. s  G- [
void PWMTZIsr(void);+ t' Y2 O! V" b
, i% D, ?0 x. U& g! `- j
/****************************************************************************/
; B: d6 }: A% B; a/*                                                                          */
' a, U* C/ m- D9 v/*              主函数                                                      */
2 o+ C/ m# e9 T1 }& u/*                                                                          */: c' v' m& F6 m6 u- o! l
/****************************************************************************/
& i/ ~/ m% Y: S; tint main(void)
0 s. W  [+ X+ x+ }{
: R6 g' |" n2 M        // 外设使能配置
/ Y) h% p6 R2 a& b3 H- C- ]        PSCInit();
" A2 P% X; B. W* k. ?! o' [4 ]) h
$ ]2 o1 H* |0 g        // 初始化串口终端 使用串口2
' T9 I; f1 ~6 B: G" @        UARTStdioInit();! Z/ O4 y# o2 O& I7 S! f+ l
       
# I9 Q# n2 x  y6 r& {6 M, C& ^        // GPIO 管脚复用配置
  `+ U5 d) a  c7 z: I( B1 m        GPIOBankPinMuxSet();
: n* B$ t' Z7 |$ w; l  s" H) a5 [
; I  Z' O8 n( e# A# p* \        // ARM 中断初始化
3 Z( g# |7 r) k% y5 t5 K# @        InterruptInit();  D% a. ^. h* J/ x% V4 J5 K, @
. @( B7 F! J  X5 B0 |- e
        // PWM 中断初始化
! i3 z' r9 d. \% @3 v& y        PWMInterruptInit();: D9 W8 p4 |! _- m4 t
. F$ T! q6 F( H
        unsigned char i;6 K6 c6 x9 g1 A; b7 Z0 n* b
        unsigned int j;. K% g4 V! W& c3 o) E
' Y0 M* _$ ~1 W2 n+ Q/ V% q% R
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
& X% p- ~4 R$ d5 B( o4 X4 a3 I        UARTPuts("------------------------------------------------------------\r\n", -1);- i8 b' O: k; }  k# e" y# _
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);2 I7 N* `0 b" r* N1 o% _. H# M
        // 产生波形, ?5 z2 I7 |2 B  l3 h3 v8 S
        PWM1ABasic(25000,50);
( `. M% k* {  g( M8 P% a; ^6 c: U( W
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);3 q% ?: L4 C/ T" ~
        UARTPuts("------------------------------------------------------------\r\n", -1);3 y+ J. r( F& ?" e( x. b

7 F6 T* ^( N; ?' h: a' c. ]/ A# r# w1 q& K0 ]! `9 v5 V7 V
$ Q2 L' F3 K/ M# Y- M! t
        UARTPuts("------------------------------------------------------------\r\n", -1);! R/ G, O3 i6 U. H
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
$ W- ^: l  q2 l8 R( J" z! X! l# z        // ECAP 捕获初始化
4 Y/ h: V, F' x2 Z6 a        ECAPInit();1 \( s: c7 r  S; d6 u4 A
        UARTPuts("Initialize ECAP.......\r\n",-1);7 B$ A$ H/ D( ^6 A) j
        for(i=0;i<5;i++)
! l+ x' {" }+ l3 _  H3 Y8 D        {' W- ?- ]1 w& t
                    for(j=0x00FFFFFF;j>0;j--);            // 延时6 K: s- n9 P, f* A: p
                    ECAPRead();
8 _, P) o( M7 [: z4 K9 S2 r        }
( B, y* H9 k0 ]        UARTPuts("\r\n",-1);6 s& R% Z2 D" \# B; l/ B
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
) W8 d# @$ h* b: ?6 X        UARTPuts("------------------------------------------------------------\r\n", -1);# [+ g$ S! s: i! c9 k  L7 [

# V" @' _, Q$ Y. ~3 y, _        // 主循环
9 v, z6 o6 n8 T; N        for(;;)
# w% w8 Y' V# }8 I        {4 l& _5 B/ a3 F$ Q/ W: K8 Q

6 I/ L) m! {4 H        }
8 B- N1 {! D6 F  i# b# q# Z}( _" }# j. N/ Y- V. h0 U
5 J! |5 q; D, E
/****************************************************************************/
- Z5 l, p! N( N: d0 d0 O% o/*                                                                          */
/ m) L! v7 ~8 e/*              PSC 初始化                                                  */
: I* L" U# D  M/*                                                                          */
; R- U: q  Z- n- U8 a+ ?+ c( ~5 p/****************************************************************************/
3 h  X- j4 Y3 |5 H% v+ c9 o7 F% Tvoid PSCInit(void)! }9 w) |1 j5 P, G! m5 j
{( c! |9 K; L' w+ @
        // 使能  EHRPWM 和 ECAP 模块
- O* {7 R! `) o        // 对相应外设模块的使能也可以在 BootLoader 中完成5 `8 [0 a# s- y# f' K4 Z: i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);/ |) P( B( {: @0 z5 ~8 l
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
# c! e5 V  C& n$ U5 g$ P}
7 Y- u  ~. c: V# z7 U
; B* {4 q) {* n8 J4 B/****************************************************************************/
6 H6 E) d- Y+ `) z1 p/*                                                                          */" V; w1 V/ O" N( _8 ^/ S! H
/*              GPIO 管脚复用配置                                           */
; Y3 V2 a5 N# w, }: s, }0 M0 H9 v/*                                                                          */
: d' N, h5 Q# @/****************************************************************************/
) I1 H* A0 }4 e# ^" R: f# V. nvoid GPIOBankPinMuxSet(void); ~9 O2 y' T# m. ?  R! ]8 y4 T. U
{/ A; m: q3 A" ?
        EHRPWM1PinMuxSetup();& \/ F0 F* B" Z, ]2 L( V

) r' Y3 d3 t) i- [/ ^( q# v) w        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% Q" U3 p; g7 ~, j0 O% _( G
        // 作为捕获功能时管脚方向为输入
. O7 P9 L. x1 K/ ^. W8 {        // 作为辅助脉宽调制时管脚方向为输出
( `0 N0 U& n& G3 s9 Q, E" k, U/ A    // ECAP2 / APWM28 ~3 T  k5 p/ Z! t
        ECAPPinMuxSetup(2);
0 g2 A' D# Q, S- A' ?
' S9 ]5 A4 Q9 r7 \& Z; t  _        // ECAP2 / APWM2方向设置为输入
8 P9 T, j6 Y. N4 J+ f$ B; I% q; I: }        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
7 L( l3 e5 a6 g2 G$ ^2 f' }}
- l5 W$ s& L9 J. W3 `$ d7 B$ H( _9 ^5 ?5 M6 _& j1 G
/****************************************************************************/: ~! {. m. j& z/ p# O
/*                                                                          */7 y  O. ~) m: m7 u; {6 t
/*              PWM 输出波形                                                */
6 g, v* m9 L  t; P  f) q$ E# m: _/*                                                                          */
- k6 \# R  U+ [/****************************************************************************/
/ d: T4 G  t" `1 O3 i! X  nvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ E& r' ~8 |- n7 t. ]4 j{! d7 D8 }9 Y! l: o7 V& k& l
    // 时间基准配置
. x' g8 k& V6 L8 }    // 时钟配置
& y, t% d& U2 _) Q    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
- \$ n2 Q: ]4 d, U  h6 j/ Y' A& k& ~3 ^: W6 L, N! ]: e# @0 l, @3 }
    // 配置周期
# N3 |- C5 p' Z. d; N    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,9 J% ^( |& B4 g7 h& u7 m* s
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
; v8 G( F* t/ U" G4 }7 N
5 y' h4 p7 V# o* @) P  Q    // 禁用输入同步信号
* v, Q- p! G# Q9 s0 q    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
, `7 N: a3 r: j; D% o1 v/ p% t* A, R; Q, |& j
    // 禁用输出同步信号
0 v& ^2 {% J' g' q# D% R& R: x) `! l    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
& Y% o8 Y/ P$ z0 d: z0 @+ G7 i& c# y' k3 Y* s5 R5 T8 V! K8 r7 j+ M
    // 仿真(DEBUG)模式行为配置1 N5 m! P1 V5 r* S/ x
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);, G( w1 _3 V: @9 v5 T7 e2 h' T
* f; W2 q. Z- O; i: a
    // 配置计数比较器子模块
' S% z+ \3 y2 m    // 加载比较器 A 值
3 k# R; D, `; f2 s3 D% B    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; w: j! `9 K3 ?% a- o
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
' M, {$ }6 M* ]
6 [' {; n/ {2 i2 G9 {7 c    // 加载比较器 B 值* F' W2 ?6 X" ?0 q/ W
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
$ b! d5 @2 L- ~" d- F  Y; V- p                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 l* b5 S! _. P- A6 u  ]2 w. z7 b3 @) u4 q7 D3 {
    // 功能限定配置(输出引脚触发方式设定)
1 Y7 n9 A3 N" d. d    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
1 o: O9 q. U1 e1 d    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,6 T# s. A+ C' m& ~
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
7 t- Q1 l: _$ @2 s: L" ~6 h                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);9 o2 I* \' r4 g% O( o

8 q$ Q# q9 c& b    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
' d" G5 e. d% P5 P6 E    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);! ]2 s+ ]2 {1 n' D: l3 T3 K
5 t5 Y$ |1 A8 ]( z. M' R
    // 禁用斩波子模块
. ~7 I6 c4 b" n& V% N    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);" D2 B& Q5 r/ j4 n

7 L# P& v. T/ P8 J' U0 ]& v    // 禁用错误控制事件+ I4 _9 T1 k" m4 y8 O. q4 w
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
7 L. k, T; ~5 L, R8 F, s9 A. A    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);% Z; I* k  n/ a3 O% r0 o" w
6 K: ]( a' ~7 {& P! T' B
    // 事件触发配置
8 C8 g/ f% c; b% i% g    // 每三次事件发生产生中断" I9 y% w& F* V, P9 n* q6 u
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);5 U. I# `. A2 t& Y" x9 O& S
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
& K: j( d% c! z6 b    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
4 W) I; d6 R" E+ l: ~9 R# X' f% F    // 使能中断! `0 Y% Y; z! m7 W
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);) S3 X% D: X, }3 K6 D# ?

( t  N9 v3 j# K. h  f    // 禁用高精度子模块, A, `9 \  y7 K/ ^
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);/ G% `0 _: ]  q/ n- W

- Y, d0 Z  n* p0 t# y" M+ R. N    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);' n7 s" d& l7 w! T$ S
}
" v" o) E9 O* @1 W* Q' E0 y# Q& c
. ?) h" s% \/ V& y' u, d! M5 Dvoid ChopperWaveform(void)
; f4 ]. p! P6 h) X" p* X, N6 F3 \{6 Q2 \: s: [& _1 ?  J
    // 50% 占空比
& k+ t+ f! ]& n7 p6 V3 r    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* j6 s3 l+ r* I, [1 Z& f- d( k" v) u    // 4 分频. U2 \2 ~& ~- @; o9 ?% g7 z
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);8 k) D8 G' o0 [) J
    // 单个脉冲宽度
, h/ `% P9 X: ?) h3 j, W2 P) e    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. v$ a* T9 V& O% K2 d* o    // 使能斩波子模块
  E- `7 W: |! t  _; A    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);1 Y# B) J8 c8 O/ T; n* e  z
}
- m8 h0 p, U3 g# e
/ a& O0 F& S( @. p/ R* \8 T/****************************************************************************/2 @1 w+ P' ^' ^5 Y; j. z" R
/*                                                                          */- K4 X9 u( g* f3 @
/*              PWM 中断初始化                                              */
1 b$ f$ B% r3 C& `* Y1 g9 z/*                                                                          */2 C) M) N9 G+ G
/****************************************************************************/0 B8 b1 e8 E  p& q7 w
void PWMInterruptInit(void)) Y6 ?! X! @1 S* B% b
{5 Y5 r- f. w  [, G( ^
        // 注册中断服务函数; K* }, J# B* ?4 E
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
0 n6 X6 h2 }( H9 b! v, y) |  J        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);5 Z; j$ h3 T* y# ?- O5 S! \
& I4 I- }; B% g
        // 映射中断
' N/ U4 t3 ]/ C        IntChannelSet(SYS_INT_EHRPWM1, 2);1 z2 x; E0 D8 _2 V# _- B: H1 {* |
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);) ~0 {3 G7 |( C: w

* H9 }# h0 D6 k+ p" z        // 使能中断
6 f( a& x2 v2 n1 k1 w        IntSystemEnable(SYS_INT_EHRPWM1);( m0 m3 }2 |. d" m+ V  ^- [
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
) _  I2 X) E2 G/ k" x: p- Z6 T}( F2 P, ~( Z. k8 U' ?
# t% f% R: o" p' P  O# a
/****************************************************************************/- F0 J- Y0 k9 Z: G1 _
/*                                                                          */
! N, ?" P) O2 M% G; i# f3 R* J/*              ARM 中断初始化                                              */
# q4 |5 q* Z/ f' z/*                                                                          */
3 e6 H, F# v% T, c8 T9 c: V/****************************************************************************/# a  g9 ~! P9 C: C* C
void InterruptInit(void)
4 w* _9 P4 B& Y1 }0 k" i/ x9 z* A5 B{
& ?* K/ u; I0 N! U        // 初始化 ARM 中断控制器6 U1 v% ]! J3 e3 G0 l+ _7 y
        IntAINTCInit();
* C! l; s) j7 p) V( \* T4 |6 ?- M
/ G2 \9 ^0 B+ _0 q        // 使能 IRQ(CPSR)
. Q) K- Y6 h2 L3 p% X        IntMasterIRQEnable();5 [% n! G0 k4 M
& U2 u1 j3 v0 B" i/ i
        // 使能中断(AINTC GER)
6 ?3 b+ P& K0 w9 q1 I7 u        IntGlobalEnable();
, ~4 N9 w% F) o, J; z  a  `/ W5 m( \/ K' a8 |
        // 使能中断(AINTC HIER)2 O1 @- T& n( K! }! d$ B( P
        IntIRQEnable();9 [, P. c9 S  w( e$ u
}
- n$ H5 D  C7 T0 ?# w3 G; C) ~3 z+ b7 h0 v

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
6 k% `! m* e) ^# [0 f# u# f/*                                                                          */
+ i/ D# ]" z2 F5 F/*              中断服务函数                                                */( O2 C% D; B. `# x. d. `" T
/*                                                                          */
( a( i6 |. v3 V' l( A  W" [5 O/****************************************************************************/. A; S9 A+ ~5 @3 W# ^
void PWMEventIsr(void)) m/ I* ~. b" o' \, {- j
{4 ]6 v7 S! O6 v, _. N
        IntSystemStatusClear(SYS_INT_EHRPWM1);
4 b5 d. I1 f  o; n8 _5 L3 H7 I; }; p
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 G% ]' p% f0 u3 o8 |}5 c( I7 f$ @( n5 p. L4 k# L
! F7 p* h6 }: i( a/ H+ k* B
void PWMTZIsr(void)% {0 L$ y* l- X6 G9 h
{$ `% g6 ^* u+ n9 Q/ P; D
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);! Q& D6 ^8 I$ @+ x8 K0 u
6 ^# _: V+ M# M7 d3 P$ K4 n
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
" C7 F) w- a% K8 ~' @7 {}' S0 h% @+ O" {, ?5 E; @
! H  ]& E0 a- s( J& S
/****************************************************************************/
/ x- ^8 F6 }. j* _) S% _; t/*                                                                          */
5 g% }; H. F! g. B$ |, L) W! F/*              初始化捕获模块                                              */
2 u- u% v9 H9 W$ i' A# o, B/*                                                                          */
. R2 V" q' h' U' Q  K" M( r/****************************************************************************/' H/ q: J0 w: R2 m$ V% H& A
void ECAPInit(void)
* M; g( V$ M' ^7 V{
/ y! M- U( U6 V  U        /*-----设置 ECCTL1-----*/3 S5 r( H4 A8 ]9 F. }$ R% V2 n, P- u
        // 使能CAP寄存器装载7 c/ Y( Y5 R" \% I* Y( \! ]
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
; ^# I- }% d2 ]$ O( ~        // 设置预分频值.
* l+ O7 W0 A! K/ ]  W. s+ N        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
  ?; y3 p, ~: N& S$ o        // 上升沿触发捕获事件( R/ J) v/ O( m1 {' c$ ^0 L9 S7 H
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
" E" K, `5 ^' h: N- S0 S        // 输入捕获后重新装载计数器值.' `1 d' M; e, L: a
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
" y/ Y/ v4 ?8 O! a- O. K5 h2 k1 l; i3 T2 t  g5 O' r+ I
        /*-----设置 ECCTL2-----*/# B% l" L3 m0 U
        // 连续模式' h: ]; e8 `7 o; |1 Y
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);/ @5 @# P+ B. C& h% ~
        // ECAP计数器TSCTR持续计数
$ M: r9 m8 g9 c        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);- F  J- P4 x/ A0 Z/ E
        // 禁用同步输出和同步输入
. a, q/ n5 ^! x: b" C: \        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);$ V% b* G! v# j/ }& L, c
        // 配置 ECAP 2 为 CAPTURE 模式; D. w) S! m7 S2 y' V; n
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);* _3 \0 W7 |8 I8 A' S# O
' d5 S. {2 S/ \; N+ T
        // 使能中断' i% j) ^$ S7 b% C! M
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
2 j4 ]5 ?8 ?: ~}
; m! n1 Q+ N, T/ ~# W; _6 d, B) e* z! s
/****************************************************************************/
# @0 H. C( P& e8 j6 A% Y. Y/*                                                                          */
# m7 f! p: k+ G% t, g  z/*              取得捕获结果                                                */# a% N) x8 k9 Y  x
/*                                                                          */
% L; g3 i. G5 k% D/****************************************************************************/  q$ \0 U1 b; q/ I& s
unsigned int ECAPRead(void)/ z8 F: F6 v8 T* \/ c9 M( h
{! v8 r% {; H: `
        unsigned int capvalue;
1 w" U2 F: S4 J2 \        unsigned long frequency;% K& ~5 r- k3 W; y- {

) ~7 H" l( Z# Q  O; l5 z. f        // Event1 中断标志9 Q3 J1 U! \+ a2 c2 Y6 f1 a
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))7 ?& _/ c, @- j
        {
4 l: n3 Z( A9 B: j. I                // 取得捕获计数2 t* Q- E, L# N3 T8 A6 p3 t
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
- M! d/ {/ v/ d                capvalue = ECAPResult.cap1;
5 G3 ~% A, p$ l- r9 V) K% ]. i8 J7 u3 J+ C( P2 X
                // CAPTRUE 模块 228M 时钟主频# V& C* B0 _% A. }
                frequency  =  228000000/capvalue;
0 [" z( K3 a, t                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ X/ V; l6 m# ]* K7 x) }
8 T1 x8 o6 G- X' x% Y8 G4 X& m                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);/ ~- v% w' @- C1 M! j. [
//                IntEventClear(SYS_INT_ECAP2);
3 L. g. n7 \$ B- E        }6 S8 A% D& e* D  d; _+ t
        return frequency;
  B( o* c; r( z2 n( f1 c}
% i8 p$ z8 N* ^* R5 T. u) E* H
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。* P2 u. x7 A3 ?
[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