嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家7 s9 T+ |$ e# @7 x  {. M

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
( g5 Q! R# B0 {+ U! l6 I- u, K/*                                                                          */
. B% ]  C( v9 e! h. l/*              宏定义                                                      */
' {( S- @* k% T& ]0 b( X: k9 ^/*                                                                          *// X1 A# {2 k9 F$ e  p
/****************************************************************************/- B; y( u( j6 t8 y5 |8 N
// 软件断点
8 f; \6 |0 G6 x, r+ Q#define SW_BREAKPOINT     asm(" SWBP 0 ");
% p1 J3 Q3 U7 Y% s2 I  U  L  ]$ ?3 c
// 时钟分频
: B2 u* w' J7 _9 f, L$ B  g6 y#define CLOCK_DIV_VAL     228
! T& Q; {& W1 @3 k8 G$ L
/ {- m) K; t& a+ M" z/ Y/****************************************************************************/% V) n: H- A  _& {
/*                                                                          */4 f3 f" m* A2 e7 ^8 }
/*              全局变量                                                    */
5 D# N5 \2 D2 Z# u' _/*                                                                          */0 y  ^  |* J/ j) g; `# s' M
/****************************************************************************/
( C4 Z) i- j* B( B. kECAPCONTEXT ECAPResult;
0 q$ c& o, ?5 |" H' e9 _6 s
3 J+ a! s% ?( P/****************************************************************************/
" }: d3 F2 M: r6 K/*                                                                          */* r$ q) Y4 p$ g; P3 Z
/*              函数声明                                                    */, g4 n* ?, _6 @
/*                                                                          */% D% k; N  o' _* `. s6 q
/****************************************************************************/8 |# h0 N2 m1 M$ a! K
// 外设使能配置% p" H2 r( s( W3 ]
void PSCInit(void);+ u4 i$ l, @5 D- r' z! c" m

  M  D# C& ^- y// GPIO 管脚复用配置! Q. z) G) {2 f! b, c+ |
void GPIOBankPinMuxSet();+ H6 Q" i4 d8 u; }, `/ K

9 j$ M# L* h( N// 产生波形9 B; T, o- P* J; t( t- Q
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
% J) G9 ?  G6 ?void ChopperWaveform(void);
& j0 _6 \3 i4 a7 v
" w% t7 \+ B- K7 }// ECAP初始化和读函数
" c# w0 k+ A; Z3 M9 evoid ECAPInit(void);: R8 b5 X! ?; F' W) t) `) H; [
unsigned int ECAPRead(void);
$ h8 N: r; V2 ?9 E
" D, }/ p; e7 o8 l) }8 Y//ARM 中断初始化
% y/ c" ~3 c3 R/ k% zvoid InterruptInit(void);/ h% @7 \! M* }2 \- `# u+ D4 o
$ N0 D( }' W) T9 |* u
// PWM 中断初始化
3 C4 ~2 {8 a0 P7 l6 Nvoid PWMInterruptInit(void);
/ V* W; W2 \! r) U// 中断服务函数
! f6 ^$ I2 D8 ]4 d( I; g5 S% W// PWM 事件: l8 Z5 o$ `2 {) W" ~+ g4 ?9 ~
void PWMEventIsr(void);
! L# }/ x, h& W, \0 o* `// PWM 错误控制事件
' y# w7 n6 f6 t: w8 b5 r/ tvoid PWMTZIsr(void);
) L, m, i5 ?# s" z4 f# N( ?( z
% N: V; v9 ?/ Z/ g- e8 m* [# d/****************************************************************************/
; a7 Y- N1 S6 ]1 ^. F/*                                                                          */3 R) n. e, y& I0 h, O7 B
/*              主函数                                                      */
8 t$ D% d2 w3 x% p1 K/*                                                                          */
( b. f- `# F1 E( O$ J+ K( ?3 P/****************************************************************************/
5 F1 a. ]7 Z# l) d; Nint main(void)  Z) G* P7 }3 N4 Q+ P
{* _+ S, k8 w. e2 s6 `
        // 外设使能配置  Z! E% j0 ^6 e+ n
        PSCInit();
0 H6 n9 s: V! D1 T& G. h
, k. e0 ?7 \" R/ T; f: t, J        // 初始化串口终端 使用串口2# ~: p3 s0 q% N$ V
        UARTStdioInit();
% o) {+ Q) J& N  i% s8 m& c2 n  S       
( @1 ]7 m+ }2 x4 e* {8 Y9 ?7 W5 F        // GPIO 管脚复用配置. G" r, v1 G3 |' C
        GPIOBankPinMuxSet();
1 V! h3 \: }+ E4 C; H6 ]7 R5 [
8 y; d) {% N4 a, w        // ARM 中断初始化
* ^7 h0 |: b6 f' L5 U7 W, Y; o        InterruptInit();( J' \7 W8 r  P! ^# _

1 w& ~9 R8 t8 f! ?7 D8 [7 o6 `        // PWM 中断初始化
5 y# G$ B1 j( u- i& Y        PWMInterruptInit();
) @  V( J! `, S5 A* k* w( W
5 h- F: ]- D0 }! k        unsigned char i;& ?7 A* q8 ]: [
        unsigned int j;- b# z+ G, v) r1 n% R0 y, y8 O

$ s9 ~+ b) k4 Y        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);: q, _, Z1 a$ l& _' C7 }' K9 l% [5 q
        UARTPuts("------------------------------------------------------------\r\n", -1);+ V" F9 w7 b5 @/ t8 b4 H" u4 z
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
8 f( j- t. ]  V+ D0 l: j; P/ {        // 产生波形! X1 M2 K& |3 R. y  L
        PWM1ABasic(25000,50);
9 X/ q1 o# ^* \  T# x- x2 w* y1 J! p$ t9 Y  C+ x% o0 ?9 d  f
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);( c$ ]& \+ W! l
        UARTPuts("------------------------------------------------------------\r\n", -1);5 h- Y. y; p: e5 n/ J9 T0 p1 b

) I, Y- ~4 |4 y; \( r5 o, j. F
# M% O" F7 ~& Q- Y7 g$ Y7 N
7 l7 ?$ f& h7 @. S, G  I        UARTPuts("------------------------------------------------------------\r\n", -1);( ?7 q8 p; A/ E8 T9 J1 t7 Z$ ^
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
/ y$ G, t7 P* A2 f5 I) Q# @        // ECAP 捕获初始化4 k& j9 r7 `2 b: a! ^" B4 s
        ECAPInit();2 b4 I6 M6 Q+ P
        UARTPuts("Initialize ECAP.......\r\n",-1);
  ?0 @- w4 l0 D# b1 ~& V        for(i=0;i<5;i++)
7 Y6 O. v$ M: H3 q9 p+ L. h        {  P# s$ @% b, [
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
$ E; T& _; h% S. o: W. p                    ECAPRead();
/ W9 ]$ h6 e* ^: Q& N        }
' A. ]( x9 \- B8 ^$ h8 u$ V        UARTPuts("\r\n",-1);
7 z$ \! v! i/ z2 L  m        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
' ?/ }  c9 r5 l7 p        UARTPuts("------------------------------------------------------------\r\n", -1);% {& i$ Y0 p) v" W6 M) o5 z$ g
! m2 i8 {1 T0 N: `: Z: w6 V
        // 主循环
7 Z  O) L' i& r        for(;;)
3 P8 z4 d' Q( t' x        {
* r% E5 B$ ?" O, k7 V4 i: E" U& x) k& L. u
        }
) Z% \1 |! _; u- D& i}! {1 E. O; X) l/ c( P! j* }7 z8 ]8 u4 V

, Q* f6 ?" C3 c' a/ U/****************************************************************************/
' t/ a0 C9 W4 t- n* L: ~# ]- c/*                                                                          */
" \' A, T5 R. d% g' V* [/*              PSC 初始化                                                  */
* _5 @2 R0 z' h9 ]/ U7 O/*                                                                          */! i; p# w/ F- S5 i3 U( U+ ?
/****************************************************************************/
/ X, F  i' x& l, c) v2 ~3 i3 C" @void PSCInit(void)
' O: b. M1 i8 K9 j9 ]+ D) j2 h{! ]% {6 [+ u' G
        // 使能  EHRPWM 和 ECAP 模块
: J9 E, F! Q7 Y; w7 n7 ~7 {        // 对相应外设模块的使能也可以在 BootLoader 中完成9 `$ {2 n1 x8 w# j- W6 o
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* L& i! U. k" J) U0 z: \( D' C1 ?& w
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);: F% [! m$ D9 }! i, p3 O
}
9 R" Q. D# e; [& Q2 e' K) J5 f- ^  W$ |9 n
/****************************************************************************/! m+ m! W5 {# G0 X) m
/*                                                                          */
( ?' l, i1 B3 ?/*              GPIO 管脚复用配置                                           */& N$ w- M0 _3 x9 e2 Y
/*                                                                          */' n" p( [  {+ u' x/ q2 {
/****************************************************************************/$ W& e! y5 k: D6 y- d
void GPIOBankPinMuxSet(void)6 [% P+ p) w- K3 o! U0 Y* L- |
{, U) w5 @0 @  \  Q* B) y
        EHRPWM1PinMuxSetup();
2 \$ C2 O2 {8 F# a7 \1 I; f
# Z% h  r& J) G7 |4 k( e% u        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 a& g- J; M. ^, w! Z1 F        // 作为捕获功能时管脚方向为输入) M- M# }9 W3 ?) x) C4 y
        // 作为辅助脉宽调制时管脚方向为输出
6 Q# B- y! _8 I) e% F8 `; c# I    // ECAP2 / APWM2
' E& J8 B: [% @! M5 n; I& G. s        ECAPPinMuxSetup(2);
& o. Z( g; o- G+ Z, a9 r- s0 ^, I% ^: t* c; {0 `. C
        // ECAP2 / APWM2方向设置为输入
/ i$ g2 h6 [1 b, a        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]: v/ {$ O- e8 b+ d, n
}
$ u% [4 _1 e+ j  C# x, i  F
9 i9 M" t. F  |2 C7 t* v/****************************************************************************/% _0 F1 y$ q. }; `
/*                                                                          */# g) z0 O' {! H
/*              PWM 输出波形                                                */
$ t) n5 P. h2 X5 g7 j# |5 O4 C/*                                                                          */
! g* y$ ]3 c* L+ B- D/****************************************************************************/
2 x: t% M: V" c/ G( N# ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)6 c1 o5 g6 X9 w  K; l
{
9 B3 v/ \. r% N    // 时间基准配置8 W7 }  W# |# s0 R
    // 时钟配置
& g& c! W/ t* i0 }$ H7 S    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);( [: g* M4 S/ V# X" s5 e

, }  l% c) w* F9 F/ c7 i/ o    // 配置周期
" F0 c' H: R5 ?! @    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,& Y# x# h( J4 U9 J  L; N) j: Y7 O
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);, Q+ X" C0 w! S8 w
  a. o/ ^4 Y. f+ Z3 E# c1 O
    // 禁用输入同步信号
! C* w% h6 m) H  n2 b    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; ~* n0 q% L/ T8 v2 x3 j

" L" y3 ~7 U% l! m- F6 ?    // 禁用输出同步信号7 ?6 K6 {) u8 `& l- p# S/ N
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);/ l8 q: ~. c; M+ I4 p
0 s, U' H5 v; c2 I* u* Y( \: `
    // 仿真(DEBUG)模式行为配置" X( V2 |% E1 I5 Z: j) s9 ]
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);% }5 O; v9 V* T
8 K$ X' s% _# r; G
    // 配置计数比较器子模块( Z8 S0 J$ X8 h4 n) |5 {6 u1 S
    // 加载比较器 A 值
. b/ L! K7 E8 a! Z( i5 ^& q* O    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,; Y: \: C$ v. x: S2 c  T
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 c$ A& A: p, p5 B: _
" S  x) `  e& x3 Z4 u. i+ L    // 加载比较器 B 值
5 h+ X* ?& r! y+ }0 q! p* }: ?6 X  s. M* _- ^    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 p. }$ F! _2 E' H' e9 P5 G                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% G5 Y4 f: p' r3 T3 g6 x
; E1 E7 d) z. x2 b$ I/ {9 A    // 功能限定配置(输出引脚触发方式设定)0 s7 y# x$ A7 Q# h# A3 t& y; f& {( Y" b( @
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
- Y  j# D! ?/ F- s0 j7 \0 D    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
3 i) x5 Y( s, g. M. i6 F                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,0 C: t* q1 z2 c3 O
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);4 }4 U. N0 B1 p' }. b# w
, C5 [; N% s) Q. @* r: K
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
3 N' q8 M& h* `# |* t: M    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);8 U$ O9 R, a0 w* l
. h( X: `# D& h7 v3 K+ p- n! U/ V
    // 禁用斩波子模块' T9 N) \( M8 C9 J
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 p4 o7 o2 B8 r( N1 r7 T2 \9 @8 G5 o4 k: H( T7 y
    // 禁用错误控制事件
$ d8 n. k' j% i6 U% u) p    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);/ c- e6 b/ W8 H2 c$ p/ g- F( q
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
9 X8 W' W- F  s4 O: y+ K1 {& G+ @  e, c3 q6 z
    // 事件触发配置
5 P9 }; @& b1 w3 x+ G, X( y( c4 J    // 每三次事件发生产生中断
* x7 o3 J8 k, A, V    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
. [' I/ @0 }3 \3 w. T5 q    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件3 w1 L0 \) K; B5 v+ n
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);# H$ v1 i8 ~# g, p3 t- K
    // 使能中断
8 i9 c- F2 V" @1 Z, g) z( U    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 a& j2 e' S& d% C2 J/ u2 G
( z0 E+ `1 _% B, N; s2 N    // 禁用高精度子模块
  ?7 k( e0 x( b7 L! }    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
5 B% `* M( H2 n& C0 Y) ]  I+ G& N7 O/ F. ~! L
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);7 L* X' M" f$ _5 o# Q$ d, e0 H
}7 |$ Z1 e& e6 a6 ?6 [+ D3 q

3 z& {) S9 a$ _, {- |4 avoid ChopperWaveform(void)
5 `- z* J: D5 s) J{
. R( y7 r& j. d    // 50% 占空比
. ^  O. l: L- f# y: d. V, {    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);( R3 C& r2 H, v8 {7 s4 E# ^
    // 4 分频+ F- F: B* q2 n
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);5 f$ T; |1 O4 j) U3 V3 p
    // 单个脉冲宽度
- b% A( e9 F, T    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);' Q! j; k" r) v
    // 使能斩波子模块
4 W9 }3 J; B& b. R; ~: ]* }    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);& p0 R( {4 x# T! Z# @2 R5 _6 W( w
}
! q) I9 y( ^* j$ p6 p% t- f. U3 n& q1 p1 _
/****************************************************************************/
9 i6 s# f$ \7 ~& F' w7 ^" q/*                                                                          */
3 C$ Z# \0 s$ S, s! E/*              PWM 中断初始化                                              */  Y# t0 u: |) c
/*                                                                          */
- s3 e5 ^+ j2 r: D* V& ^) o+ G/****************************************************************************/
& s1 o- {7 y! O& @8 pvoid PWMInterruptInit(void)$ G9 d: }0 W  @% i! ?' j! n
{' Q) R' y5 a0 _' `& m5 g1 v/ g
        // 注册中断服务函数
* b) A, G( P1 Q8 \; Z" m/ F% F, J3 o        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);: v1 ^% _8 B8 x& K  c3 o3 q
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);0 U9 }, g  N* @4 Y( s; y
# Q6 I# ?( w+ V/ H
        // 映射中断
7 J% x. H; R. o) W7 {  w* m) G2 y2 H7 A        IntChannelSet(SYS_INT_EHRPWM1, 2);- }0 V; v5 s+ U; U! W; I
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
) ]; ^0 w# O9 ~( a( `1 c; Q$ k8 M/ _7 H6 n& r6 |7 H
        // 使能中断; E7 m7 Y3 o$ v3 H
        IntSystemEnable(SYS_INT_EHRPWM1);
( p* {2 v$ H* e6 W7 z1 P        IntSystemEnable(SYS_INT_EHRPWM1TZ);# f" f4 |2 V, K+ B
}5 T& c- r8 O4 r, b# ]$ ~* v# \7 ]

, N2 A# L" y: w; X$ r- ?/****************************************************************************/+ y/ z  ?  d3 u# |8 E+ k% \
/*                                                                          */
- S" i& P2 P# }8 U/*              ARM 中断初始化                                              */
% F. [% |; F  B: Q- c/*                                                                          */
6 ]" ~* [1 |( j# A4 x: x/****************************************************************************/
' `: S9 Q! `7 o7 q* v0 [void InterruptInit(void)% X1 h7 h: ~" @8 P7 l
{9 b4 v- c: F! Z" y' o4 b7 J3 M5 ]
        // 初始化 ARM 中断控制器( y; m' g- ^8 l
        IntAINTCInit();6 q1 y% T8 s" W" d5 l

4 t. H  y6 k+ @+ s        // 使能 IRQ(CPSR)
) N$ Y* [/ M2 f( r: g        IntMasterIRQEnable();
  F; b$ r  s1 B& Y4 v, A8 G6 e
# T* U* X+ W, T, w4 j        // 使能中断(AINTC GER). X. L( |! Q3 D' l$ e: {
        IntGlobalEnable();
. y; U6 I/ D3 w/ e' h$ j- n
5 p" M, Q0 s* j& B5 M5 X        // 使能中断(AINTC HIER)7 {9 b8 Y+ Z) O( \- }8 l
        IntIRQEnable();
0 ~& U8 R: J' B2 b5 B8 o}
0 Y  m1 j4 y- J7 ^6 |$ g  s4 k; \: h# k; _) q) ~

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
& }( _/ U9 o0 [/*                                                                          */$ l" |- e: V/ R- G6 K' n
/*              中断服务函数                                                */
* V$ ?$ ?+ E3 f" o5 K7 ?+ H/*                                                                          */
+ X5 _0 ^* ]0 l5 t( x$ r- i3 o! C/****************************************************************************/" r, ?; V- e9 l1 h6 J! b0 _
void PWMEventIsr(void)+ a$ T- Z! C$ v2 x* J& f
{
% p3 M8 [" D- s1 W! @' M0 v  x$ f' Y1 ^        IntSystemStatusClear(SYS_INT_EHRPWM1);
" V/ D+ o$ @' k! }: }& ~. d0 h4 Q+ l9 X5 l6 [
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' v5 S; ~3 Y! M* R( i
}
  ]9 S$ Y& U0 O- g' \; O1 o# J7 b: N$ f2 G& |
void PWMTZIsr(void), ~0 p6 x& ^+ Y) O/ B0 D$ s
{+ A8 S' H) R* H* h
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
1 |% u$ C" x1 Z: W& B% F0 O1 @  [; L
, ]) i0 l, r* u' _    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
# n; D1 w/ }: ~# w- N}
& X% u7 E. g( u. n: D& ?
! N$ S! _" Y' Y2 y; ]/****************************************************************************/
% a6 w$ u4 {; f" O/*                                                                          */: N  b' C' K* g; F4 a1 E" a/ e
/*              初始化捕获模块                                              */
8 L; j4 e5 [" Z0 @0 l7 V/*                                                                          */# o+ H5 i! n6 v  S
/****************************************************************************/; l7 ]& {1 C+ ~
void ECAPInit(void)
4 d# u. R: J# l: e- a  x) M{5 u( M/ a% ?& T$ K- L  J- I
        /*-----设置 ECCTL1-----*/
- L) u5 }. R: `3 O        // 使能CAP寄存器装载
7 l  l- Z2 c: j9 G" E" V        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. y. i1 u4 `- F6 L: D& {, [        // 设置预分频值.
/ y* }+ {, {) H! e) |1 n/ l        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);3 i9 ]( K+ B( w. }1 s& k7 ]
        // 上升沿触发捕获事件
: w4 _* l1 U' |0 n        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& j" g- e* E: Q( R" \7 l. n- K        // 输入捕获后重新装载计数器值.
7 T4 T# \/ r  _; p        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
1 Z3 _4 {. M7 @; W9 k2 H4 z# ]0 T* l6 Q& B- I* J  P5 G
        /*-----设置 ECCTL2-----*/
. p* h: v$ L' t        // 连续模式9 m- J, j  N/ ?0 y: `$ t
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, B% @7 J2 i7 D: C- ]9 J8 b
        // ECAP计数器TSCTR持续计数
+ A6 L9 B# x& ^        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
6 k) s: o$ B8 C' \: \        // 禁用同步输出和同步输入
) Q" g, J" I5 \3 J, q6 S8 G7 F        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);- n8 @9 T) c" n; U- @
        // 配置 ECAP 2 为 CAPTURE 模式* x3 ~! s+ @' B% c
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);, V" t6 g  h  o- M: x% U, D

4 {' m# O( Z. P4 p) P        // 使能中断
( g  ?% [+ R0 {; z5 [4 D//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
( M& p2 D2 s% u7 a3 e}& [# Y& w4 N0 C! [1 d

% r& s* ~7 g5 a" K  V" L9 v3 K/****************************************************************************/. U; l6 v2 A% @/ g, r, S- r* p
/*                                                                          */
# z7 B+ c- Q' H" \8 R) j/*              取得捕获结果                                                */
5 t; J0 A$ v- U/*                                                                          */
1 |9 k: ]6 O. l' t  \8 q' L/****************************************************************************/
7 h2 @0 y4 R, q6 D! J8 N7 W* junsigned int ECAPRead(void)0 Q% `  w3 |+ g
{" r6 [8 L( O$ ]# y0 h* D% X
        unsigned int capvalue;
" t( J1 x" K) u& a        unsigned long frequency;
( d8 c3 D( V* l% _- b! B2 g/ d8 K, j" E. n
        // Event1 中断标志: S; o" X. o9 ~4 x; e8 c, c& G
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
, F( Y  ?" O: d0 @' p        {% k0 ]$ m8 v- H7 U4 V$ V3 N& V
                // 取得捕获计数
7 {5 Z  t2 w" B  [* u* e- ^                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
) o$ h& _, u# d4 s                capvalue = ECAPResult.cap1;! F& A; X4 t) T
! e# e" p! ?. ~6 B5 u  G
                // CAPTRUE 模块 228M 时钟主频- @& H& q! Y2 i( z; a( b- q
                frequency  =  228000000/capvalue;5 Z% `7 k8 i: c5 i9 Q0 {. e
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);4 v9 N) @( U& k" h$ F1 d9 d

$ e& X! N1 I5 c; j                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);& m' T+ W- _7 T, @' ~  U
//                IntEventClear(SYS_INT_ECAP2);
5 X3 g+ w# Y: W5 N, O0 _        }' N& ^) X3 P& J1 h# `  C, e
        return frequency;" l& q# n) [& B/ y3 p3 y
}
! [) |& H7 R1 r
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。2 v; U5 I" o/ P( ^8 e+ 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