嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
* k1 o# k9 j& U: d# z
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
" z+ T4 y! v$ r$ |: w/*                                                                          */
, \% U+ D6 U% H6 M9 \# D/*              宏定义                                                      */0 a$ D. ]1 r6 U& ^: N* K% s5 t: Z8 I4 p6 d
/*                                                                          */
7 Z6 k% r. e& |* }/****************************************************************************/  f2 s, z  e* v: h: c& T& f
// 软件断点
% z6 O) o, d9 G6 V! }! r, _; v#define SW_BREAKPOINT     asm(" SWBP 0 ");, j$ h' N( n! @
% S. k1 ~- S6 t  \
// 时钟分频6 G: r2 E, ?8 p$ U5 H
#define CLOCK_DIV_VAL     2289 x- }5 a6 B, p. i1 p% f! f
9 b7 t# N) U+ t) T2 {! W
/****************************************************************************/! @0 s, ~# h0 x( v$ ^" Q+ G
/*                                                                          */' c' {# j, \$ f: ]
/*              全局变量                                                    */  N" f7 a& X% U/ ~& N) t
/*                                                                          */* g$ `$ E" W  i! ~/ W: S
/****************************************************************************/# W2 C* m1 V8 \
ECAPCONTEXT ECAPResult;. p+ _% B2 R9 Z
2 b- {. \7 x+ V
/****************************************************************************/
& N1 w9 x% Q6 n" W" ]& E0 _+ q- H/*                                                                          */, k) H) g: ]5 o
/*              函数声明                                                    */
1 g& h( L$ U1 a9 Z8 U9 F/*                                                                          */
! ?0 k) [$ E) O) R/****************************************************************************/
8 l2 h5 k8 D0 J: _// 外设使能配置
1 e+ W/ S& J2 k3 j. e& A' K. Tvoid PSCInit(void);. H$ `% y3 ^7 M5 d* l: W
2 g" N- f' N% h) X5 N
// GPIO 管脚复用配置
; i0 }0 C6 R  Pvoid GPIOBankPinMuxSet();. S2 W" Q6 s- S- p4 d
* M. ]* M* c" P, o# p4 s
// 产生波形  z  ]1 M2 E4 m& K
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);8 c# `1 \; G9 p% r& x
void ChopperWaveform(void);
" K. j5 N, w( r* o
7 w, H7 m  N( y+ Q* J$ [6 G" ]$ z  Y// ECAP初始化和读函数
, K: ?$ u' C2 _6 Qvoid ECAPInit(void);' c7 U8 h% v( _/ Z8 i7 \( x3 k
unsigned int ECAPRead(void);
2 g) y+ K2 q# `1 k0 F3 D
1 A* ~4 v- z5 q//ARM 中断初始化
$ c" _+ n$ q; W( x& A/ L8 K4 Hvoid InterruptInit(void);5 p; v* Z" K8 O% C% G

# s% o+ i! S- L6 G) w. D// PWM 中断初始化' I$ @- B8 o/ g2 A/ t! ~" Y
void PWMInterruptInit(void);& T' ^- @4 u- W, m  u% K5 G
// 中断服务函数
, r; l  _3 i) w9 M$ [$ ?' e// PWM 事件
9 _' I. z. W" E3 _void PWMEventIsr(void);
0 g  d+ d7 Z! W' ]! w  L  f// PWM 错误控制事件, K/ u1 \8 ^9 p% c; m
void PWMTZIsr(void);) A: M& f" G3 s  H3 s2 x: P; I0 U
% H* E( K* M6 v, i: p
/****************************************************************************/
' b2 F& I0 ]% J) e  M1 M- S/*                                                                          */
% y; y2 I" x: W5 s/*              主函数                                                      */
. v/ @& ?# g* @$ M& `) Q6 h/*                                                                          */) Z, u  k6 b7 x3 T' t4 P2 Q. l
/****************************************************************************/
% D. q1 V' u4 S/ B. j4 z  ]5 Jint main(void)
4 N* q7 {8 Z6 [( Q9 ~3 t6 F{' C/ O5 h- S$ _4 G/ r
        // 外设使能配置; L, P* W- D1 _5 P, @
        PSCInit();& {# @: m( y2 `' `3 |2 u3 g# F

" i; X6 y/ }* Q. V5 Z) I. E. X3 f        // 初始化串口终端 使用串口24 M, I9 n% o0 A$ A7 L2 `& S
        UARTStdioInit();" m) n9 S3 ?, G* k
       
% w: x- q$ q8 }! _        // GPIO 管脚复用配置2 u$ t" ~# Y1 P: _9 N
        GPIOBankPinMuxSet();
: d5 @) j5 {; s
2 v5 E" S$ l! Q% C- x        // ARM 中断初始化: g. a" `3 w. l4 g/ D- ?% A: `
        InterruptInit();1 d- a) r6 H1 h* @9 ~
7 {( E  V& [  C- k
        // PWM 中断初始化, o: V8 e  B  `- d  |
        PWMInterruptInit();
2 l6 O# P4 q/ E+ h+ n# X: k! A* H+ Y+ e7 \2 c
        unsigned char i;
/ n- G3 `" {% c        unsigned int j;6 S4 ]/ }) Z3 Y; |( \, }4 h

4 M" z: W  G) k( o3 p9 {8 Y( _        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
+ ?4 \& ?! M9 `/ }4 N        UARTPuts("------------------------------------------------------------\r\n", -1);4 h2 o: H5 j, u' b* Y
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
8 I  p4 ?6 \, l        // 产生波形
: V! o3 x4 k/ q        PWM1ABasic(25000,50);
& T% T/ H# u! Y, W( b% C& l; _% I8 b# U2 T- a  |! I
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
: m0 q, @7 r* Q        UARTPuts("------------------------------------------------------------\r\n", -1);
% D1 M+ o  N; \! u0 A7 q  M1 W( Y8 O) f6 G# n% T& Z* E7 N& @

* d  s, P( ~; }) l6 w  _9 u2 P8 ]9 D% }; h& ]; x
        UARTPuts("------------------------------------------------------------\r\n", -1);
, H; b8 Q  q& H% m3 M$ V( H        UARTPuts("                    C6748 ECAP Test\r\n", -1);! B' t0 q' H  t% n* J0 M
        // ECAP 捕获初始化
+ a3 Z( y8 Q- D) V5 Z        ECAPInit();' k. T6 A! C! Q
        UARTPuts("Initialize ECAP.......\r\n",-1);
( x2 e$ b3 n3 Y4 ?  k, \7 \# N0 N        for(i=0;i<5;i++)+ l! ^5 n# p  @4 i+ V& Q; g
        {* n. P% O/ [% @# q7 z& F; V
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
4 n, N7 t- E& k/ n6 T                    ECAPRead();4 H6 t' W  s7 b9 {
        }
5 [9 }5 {- a/ E2 d9 T' Q        UARTPuts("\r\n",-1);0 h" ]# I- a2 `: W5 d1 o3 U7 B8 M
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
& K. \' q# v6 t% ?# R9 U        UARTPuts("------------------------------------------------------------\r\n", -1);
* Z+ |7 [9 Y3 d' ]  q% r' i4 @' k
        // 主循环
1 P# R3 ?7 w! e$ k4 U+ f+ d1 x        for(;;)
% C. z. ^) J6 N  a0 w        {
3 D. [& H+ Y, H! o; z* A# L! P* ]3 J% {) r  z8 H' x: T6 j2 `$ k" U2 J8 A
        }7 T+ a3 Q7 ^+ u
}. z/ x- L4 `$ A; J0 b" Y

1 A6 s: h! y7 {6 H- J9 V$ C/****************************************************************************/3 m4 l  d: _3 l; M! W3 S2 Z
/*                                                                          */
7 C& T5 [9 Z+ n; |# C+ S" P/*              PSC 初始化                                                  */, c; b+ P- h* l  P& x4 p) b
/*                                                                          */$ N$ Y! a# G1 k: v
/****************************************************************************/
( w* A$ f5 l/ l7 wvoid PSCInit(void)$ ?! X% G4 c" Y; C9 K
{1 |4 A. D% H3 M: u# e
        // 使能  EHRPWM 和 ECAP 模块9 U! ?& Z' V. ?4 I( C
        // 对相应外设模块的使能也可以在 BootLoader 中完成- x8 Q; k. p  Y! D4 [
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 H& L4 [+ i. n/ Z! P- h: o
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' c$ v- E, K* J5 S" \& a
}2 ^% L- o6 r* [& \3 j

' G( v, H' `, ~/ ]& ]/****************************************************************************/
) a" @- p& L. ?9 K/ V% L; f/*                                                                          */" w! U' _! r( H! l* C: I+ V
/*              GPIO 管脚复用配置                                           */& e* n( d; r3 \% k2 ]% H
/*                                                                          */. @5 s0 D7 \8 u% C( w$ k
/****************************************************************************/; f  Q" ^( q+ p( e8 _  Y
void GPIOBankPinMuxSet(void)
2 o# k, q  r* C, B5 r3 g# L9 h" m{
; v( b+ m; ^. a( ^( j2 L        EHRPWM1PinMuxSetup();
' J1 l2 R9 S7 [( ^6 n* v8 [/ `& ]) }5 j, {0 ^$ }3 b7 M7 ?
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)$ ^8 C0 a% Q, ]8 d$ g, W5 n7 q
        // 作为捕获功能时管脚方向为输入
: p3 r! b" ?0 Z# l8 V2 s0 m        // 作为辅助脉宽调制时管脚方向为输出
2 P+ w: F- r& @! Z2 [% o4 F    // ECAP2 / APWM2* W1 L) ~& r  H$ Q2 O
        ECAPPinMuxSetup(2);$ D  ]3 N* R# M0 Y
% B3 W. P( S. {" g2 c4 a' S
        // ECAP2 / APWM2方向设置为输入. s+ G' s# i! y. V3 Y8 J# s' O
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]  X/ o# ]$ g: [0 ?& {
}, y4 r0 H( u; o* \$ N" ~2 e& G  g7 z
4 y4 E: q8 e! I7 l2 {. {
/****************************************************************************/5 D) i9 b" V% M% j% M! S% W
/*                                                                          */4 H3 {8 M) o; u. p! K, z! Y
/*              PWM 输出波形                                                */: T' O) s/ U8 Y: U  \
/*                                                                          */
# o# }' Q3 R# [% ^" r/****************************************************************************/
& ~8 Q1 W% @) L+ P0 M# hvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
$ I& C- Y) u9 j+ t/ S+ r# }- b+ v* @{/ ^% X* y, m; F
    // 时间基准配置
- @) X0 z  V: B2 Y% m' e1 r$ V: [    // 时钟配置8 M8 E$ E4 @1 Y$ \( M
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);6 l6 ?: C, H& ?/ m! V7 f: C5 v
* |/ z0 M5 V9 g/ ?- S
    // 配置周期
/ D" o! I5 [. ]: Q: h    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,# e, f6 Z* Z7 g0 S0 i4 W" J& \
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);2 H% [. e7 S& ?) k+ v6 D

8 @5 Q3 t& W* b9 m8 R( F4 m6 Q    // 禁用输入同步信号
& f) v4 v& H- T9 o8 C3 W0 B. P    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
9 n4 P, L2 @2 n$ _
( Z( L0 `6 d" [% x    // 禁用输出同步信号
6 o' I" s1 w/ g+ H. j4 s5 u5 S    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);9 s; t* F# D! D1 w- C# ]+ U0 j4 w
5 z# S- Z5 v! B+ p, t6 c5 I
    // 仿真(DEBUG)模式行为配置' N7 Z; V7 B( L$ ?* c
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);; x6 W. E* _+ P- }
$ h+ g# [* p+ ^1 V% N
    // 配置计数比较器子模块
8 t2 b5 i( p. r- I" j1 B& i    // 加载比较器 A 值
" b- K6 v! S. E9 i5 q/ q! ]& t: N    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 Q$ X. o: `* Z, t                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);: q2 H* w. `5 p3 t
2 s- \1 `# m" x4 \
    // 加载比较器 B 值
: ^& I/ x: t0 @' }1 E5 Q    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,/ ~1 N9 w- E2 y
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);' P8 |( A( l9 p# V2 t
2 y! Y  `* t7 L6 X, a
    // 功能限定配置(输出引脚触发方式设定)
3 M) b+ W- c, |' H; I) {    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出" f. f) m2 `2 e3 a6 a7 D
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 P( K4 d% ~3 b                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 `1 {9 o, ^3 n                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
& p, {0 _1 v  C; N, ~. }5 B/ r3 q* h! i" ^/ g
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块- E0 y& i5 j; \$ _
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);/ d9 P7 l. J& A9 B2 F  D6 w" g

( s# X, B" K2 u* I/ w! E' s    // 禁用斩波子模块
3 B) I1 B# h" D    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 J: v7 X& I5 V5 f4 T2 @, C4 K
, E5 ~% f1 v( B/ i' }    // 禁用错误控制事件
3 b; r. w+ {6 t( Q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);6 T# ~- Z* q; E
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);8 ^# \+ s& U  O6 }

% L$ R% h) u: l( `; p& W    // 事件触发配置  Y9 t/ F- @$ I' ]
    // 每三次事件发生产生中断
! E# H$ O  i+ |    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);' v3 \7 S7 Y" ~" X
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件% i9 ~! h! }7 ^0 }9 M; R
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);$ f5 v% `2 M- p+ t+ D
    // 使能中断' s+ @8 t& x( |  x2 g0 v8 Y$ {& b0 j
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);- ^6 O6 X! n; q# D' L5 H0 @

! ]' P! r/ z/ S6 t9 I+ B% t& g6 X5 ?5 N    // 禁用高精度子模块# E  o/ X- B; |! ~3 z
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);1 G: w0 N* N8 F6 T

, q1 T! P; G$ b8 v    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" T0 u  d4 m3 x  ?  K$ F}: H$ a5 g, y( h# K/ g7 N5 g

$ T3 T) b, ^: _' J3 E' e2 I6 ~9 qvoid ChopperWaveform(void)1 x7 E( O  u8 U0 ]6 y0 @
{
5 \8 {4 e# z0 U2 O9 x9 Z* K    // 50% 占空比5 X( x# Q& b4 Z+ X. D: G
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);2 h( ^: G, c: S6 p
    // 4 分频
8 D# L& V0 y8 d8 D( h- u    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
" L( j! s. a( G9 `    // 单个脉冲宽度
+ c' b, F% `8 l3 H1 I+ k4 Y0 [    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 l* H0 v8 P2 [/ A& f2 a& F    // 使能斩波子模块& q" i: }4 M: Q  k' t( c; Y9 ^1 Q7 S: q
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
1 Y" r" }  K6 P0 ^' K}7 b) F0 v& K: I+ [8 e6 o; f
! }# w5 U& x- V7 o( ~) p7 `
/****************************************************************************/
" w6 U7 J& M  M! L/ [7 n/*                                                                          */3 x; l& u% O0 X% l9 {5 _- m6 O
/*              PWM 中断初始化                                              */
+ ?1 T" X6 t/ `  S# a, M9 J- x/*                                                                          */
! q0 y, n- v& P) G+ m/****************************************************************************/8 F7 j2 V; r6 _0 L
void PWMInterruptInit(void)5 A# `4 |) b6 V2 }: Y2 ^
{
3 _: v5 Z4 Z8 r- o  T/ a' g        // 注册中断服务函数( Q: P. h8 m4 k0 o
        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, Y+ L  ]6 r# s1 v: L. L  ~: H$ g
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
% t7 {# M) \4 K) @8 ]& a2 S  P4 U2 P/ ]& n4 }: ^/ r! x6 S. t0 k3 ]
        // 映射中断4 F# @% t1 ?% _& s  r2 Y+ W" v
        IntChannelSet(SYS_INT_EHRPWM1, 2);
' i' A6 |7 {5 I- ^        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);) F' p9 O" N1 M9 v- m- @2 Y& J
0 T+ `$ b6 }8 O* I
        // 使能中断) q0 z( V  H, A0 \
        IntSystemEnable(SYS_INT_EHRPWM1);
3 R7 M1 A6 v" P* t& w        IntSystemEnable(SYS_INT_EHRPWM1TZ);' t0 g: m; y) d, |0 o
}
" k; I$ t" s+ ^1 b. G$ e# I
' {% j" @( K8 _* c/****************************************************************************/, y4 T( q( }7 E& G# {; l
/*                                                                          */
# z9 E, c- t$ K# s) v, A1 _/*              ARM 中断初始化                                              */; c/ q7 _3 j: T' Q. n$ l
/*                                                                          */' b# P+ Z* `+ @  g2 U  }, f
/****************************************************************************/( b7 S8 p, B# @' i8 l$ M9 i, n
void InterruptInit(void)
: G% ?& t! K8 V) W4 O( k7 T{
* G( p, k9 d  u8 x( Y( F3 [        // 初始化 ARM 中断控制器
! l; X) c1 ^3 }9 v        IntAINTCInit();
( d% b) B) O3 R7 Y5 T6 h( \, z2 Q  s3 ?
/ ?1 e# D/ W# z        // 使能 IRQ(CPSR): g+ t* p; t! E
        IntMasterIRQEnable();6 c9 W3 ]  ?4 |  S# D; Y

; B7 }( m: b' J' I) I+ k        // 使能中断(AINTC GER)
1 K# e+ `/ v6 K% `        IntGlobalEnable();" a6 K" n! k. n/ w7 x
' \/ z; @8 U5 s3 Q" m* r( v
        // 使能中断(AINTC HIER)
0 V, R2 E8 {" `6 w6 f/ }        IntIRQEnable();
: y3 ?) i! Z5 F3 f9 h1 D1 Z+ _}
& h& s) o/ S7 G* W' x& L
/ U: Y3 s$ }0 B) K, \9 W
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/. }: ]$ K% ?6 v# D8 g
/*                                                                          */
3 O' X' m- }+ Y( y# `8 x/*              中断服务函数                                                */
) V4 M0 A" V% N1 |, N) @9 n/*                                                                          */% `8 K) J# U* I& i3 \3 a3 E  x! }
/****************************************************************************/# J6 s* _9 z) a* i+ H) J$ Z
void PWMEventIsr(void)
! [, K  Q% s- }  n# E$ q0 G{
  Q0 U/ i6 q0 q        IntSystemStatusClear(SYS_INT_EHRPWM1);
) S5 p0 C4 Z0 u( J3 m/ C" E& D! |' Y1 H+ {
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);7 L: a1 z! V& r
}7 E6 K  H; g% d

8 `( P, [" Y1 A0 {void PWMTZIsr(void)
  x; }9 @1 k7 O/ o" b# ^{# q; G1 E  d& K6 |
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
5 K& d- k2 d" n8 S
; x- V  T$ R( G. b6 ^: @* y& Q    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 _3 |! o. k1 [1 l
}# ], D* i/ b/ q* Q- o
( I& v0 `2 ^! F: e/ p6 a1 B3 ]+ X/ Y
/****************************************************************************/6 c4 a* _; s. ~0 }
/*                                                                          */' I+ e4 i& E3 d/ s6 R6 O" z
/*              初始化捕获模块                                              */! W/ f  W% o9 z/ _, D
/*                                                                          */) g: ~3 @% I& h9 y3 s) \( i; i& i  Z
/****************************************************************************/' v2 H: c6 p; {# o
void ECAPInit(void)
2 G8 t2 l$ F* @{2 O% t9 U% y& O+ @9 j
        /*-----设置 ECCTL1-----*// |6 C' D3 W; K& Q! O+ w$ w
        // 使能CAP寄存器装载
+ c6 K9 _; S! W3 [# u        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);1 g+ t2 S% }1 g% e4 }
        // 设置预分频值.2 c# Y: E* ]9 d" v- s1 ~% Q
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);+ P, _5 n8 }; l! r& C
        // 上升沿触发捕获事件* R+ A( X2 |0 W6 z+ [  n" |
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);! I7 m3 C9 n2 {& A. z* ~
        // 输入捕获后重新装载计数器值.; ~7 T; d, Y9 t5 x2 [/ h
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);/ r6 Q1 }$ E9 B

2 P8 w+ V: p8 A4 ~  f) `        /*-----设置 ECCTL2-----*/* G0 v' q1 a: I/ R/ m' j% t
        // 连续模式
6 l& h( S, r( [0 N. w7 }4 y  P        ECAPContinousModeConfig(SOC_ECAP_2_REGS);  x* B  E% x8 `, }6 T
        // ECAP计数器TSCTR持续计数$ V7 |6 U7 E- V) g' x, f
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: _( e' n  J6 R* m& [9 s0 J        // 禁用同步输出和同步输入
( P4 J: a, Q0 f# u; l        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);5 U* v% k2 B8 N4 N9 a1 V+ [& |
        // 配置 ECAP 2 为 CAPTURE 模式5 N$ q" D& `% s
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
/ G9 A: H9 ~8 V$ ~  d# k( \& P. B
0 `, F4 F  A! S, x        // 使能中断
& q2 q. i# [3 v; e1 F) X8 F//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);) T9 S6 m  E: D; e' q' s
}& @2 D* `9 v. S: V3 f
8 o* A6 S& \) q' |( k
/****************************************************************************/
* q$ A0 p- y) ^7 L/*                                                                          */+ a% d* q; `! Y* P) S/ f8 Y5 ~- l
/*              取得捕获结果                                                */$ F% m5 a* t1 V! M7 O6 h
/*                                                                          */
* q* C6 G/ ^' V  ?5 g$ p+ ?/****************************************************************************/
) w" I5 B+ f; T) G: o# D! Iunsigned int ECAPRead(void)& V6 r% N8 A* X
{
9 w( N! w1 \- d3 U, |; r& S        unsigned int capvalue;
- z6 ~8 N' F5 p7 U        unsigned long frequency;
6 t0 o! @5 a7 [& Q! }# ]: \% B$ _% e( @7 l5 k5 o3 Z* ]
        // Event1 中断标志
% Z4 Z! Y; _5 v. b        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
( ~, y1 h' c* q) y* R7 {# j        {2 |5 ^6 D( s# R' K# ~* M: f/ ^
                // 取得捕获计数
& V# h$ M3 d, a* K+ Y+ Z0 c3 r                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);4 `1 T/ ]+ {% b/ D
                capvalue = ECAPResult.cap1;
: o& T" ^/ k/ R7 M  [5 t! l
2 {5 E- j1 V! r& i4 F) h                // CAPTRUE 模块 228M 时钟主频) V& j. F4 N" G9 P. p% h
                frequency  =  228000000/capvalue;& y9 B/ g; y0 U
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);6 n( Y  s4 x: V! R# L. w% Q

  _' f& |- h/ a4 ~6 b9 O                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
! R2 d1 L( m4 {$ C! ~) y; S* j: ?; F( m//                IntEventClear(SYS_INT_ECAP2);+ b( d, P6 c: W: d  A6 o
        }
. D& q; ^2 A5 W5 l- ^# \' D5 W& a        return frequency;
# [. ]: ]$ E0 Z: D6 @* P$ Q}
( U9 A  O% G) U! R/ U5 |9 R
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。" s  ]* m5 {0 d0 x! J, d' |
[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