嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家+ I# A7 N2 C4 W) K  D& n* \+ M

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
6 p1 U1 W* E# R5 u/*                                                                          */
8 x8 X1 p$ z3 A6 j% Z/*              宏定义                                                      */: n; {( u& Z% C" x  u. J9 t
/*                                                                          */
' F6 y1 {8 ~- [4 Z2 z4 N+ ^* ^" f& }/****************************************************************************/
  L8 |3 \& m, }8 G' ]// 软件断点( f- |- s$ @: Q$ Y! U! |% b# U
#define SW_BREAKPOINT     asm(" SWBP 0 ");+ ?4 ]7 J, k( ?: A

7 m! @; Q& m: o& r// 时钟分频
% y4 X  I3 o4 [% V0 O#define CLOCK_DIV_VAL     228
8 R" U0 {8 j, f, x1 A- @. Q+ H' H9 O
/****************************************************************************/
* j* b1 y: ]; b, ~; c# l+ q0 {/*                                                                          */
% |' ~& ~# R1 _8 s: A/*              全局变量                                                    */9 P6 n: a5 K( L3 G9 N
/*                                                                          */
+ ^% e& j* q* ^. Q9 L. ^/****************************************************************************/
/ a% q( Y9 u8 K/ t4 ]ECAPCONTEXT ECAPResult;0 I8 [: N* K. L2 ^0 a& {( C. b+ X

- H" a; `/ k. V1 n/****************************************************************************/
( [3 L) ~/ L, B3 d2 `4 _. N/ F/*                                                                          */
# n* h0 m, [+ C& A/*              函数声明                                                    */
6 B! h$ F8 j+ {6 r& k2 F) x5 a/*                                                                          */
% H! |5 E7 @. f0 z/ M" D/****************************************************************************/
1 {9 s2 i: r8 y' Y5 g. W. k// 外设使能配置
( `3 `  p6 ~6 ^void PSCInit(void);# j: z* }, O* H0 h

0 n- r6 j4 R3 M- U* E+ Z/ i// GPIO 管脚复用配置
' _7 ]5 T, ~. S' @/ B  ]' c/ rvoid GPIOBankPinMuxSet();# ]% b& u. \, ]" S( k" M3 F

1 h/ _( @% L- D2 ?  h// 产生波形
$ H0 @+ U7 f& i, n" tvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) n$ v4 q7 p. W4 l1 h
void ChopperWaveform(void);# @8 ?: p, f' N$ q# Z4 k- V

0 X: y5 {3 g/ I2 v/ f3 O// ECAP初始化和读函数- H! t8 ^$ _; D0 n: Q1 [
void ECAPInit(void);
. y9 x& `. b4 D7 ]8 d- Yunsigned int ECAPRead(void);
# O" x' g" L; s0 P/ J2 _6 X$ b! U* i# E8 C2 v
//ARM 中断初始化( d; p& A" {7 q/ W$ G5 `
void InterruptInit(void);
! H; @2 E; {. }- w5 O, i% g
( z6 N9 u0 ?7 V// PWM 中断初始化7 C0 M, W8 P9 A
void PWMInterruptInit(void);
/ ]0 q* u( u) R0 {* y( W0 j- Q// 中断服务函数0 P+ Q$ l+ L) d) P1 i7 }
// PWM 事件
0 z+ e1 E7 x# Y; d6 c' R# hvoid PWMEventIsr(void);6 w; Y& u. c: X! Z
// PWM 错误控制事件
" z7 ?2 T1 m. a$ [void PWMTZIsr(void);# Q/ Q' g8 }2 a; }& o% k
. z/ l$ F& X1 {# R  p1 I
/****************************************************************************/
1 z' u# [4 I2 u2 l/*                                                                          */
- w1 S" Z) g( U* _9 D8 V, }0 m! d; _/*              主函数                                                      */& E! l4 {# \# K  e5 t2 r
/*                                                                          */
3 P, n1 l6 G2 F4 v/****************************************************************************/  v7 J! Y) r. `9 E
int main(void)6 ^3 S+ E4 O* {" [1 L3 y& {
{
. S. Q0 V: c/ Z- {! O3 \7 S+ n        // 外设使能配置) b  j* _1 s1 F4 v- ?0 \
        PSCInit();) q8 n. O! r: l& [8 Y
2 F1 j. J5 `% L4 I4 h
        // 初始化串口终端 使用串口2
0 y$ ~( X# J9 T4 |$ k        UARTStdioInit();
) e3 r) \- L( d0 C9 z       
# n3 n$ w, X( y        // GPIO 管脚复用配置6 P- Y3 g6 a# a
        GPIOBankPinMuxSet();
+ M5 F, m" Z% p- v4 y" I
! o! g. `9 _3 J6 P5 k        // ARM 中断初始化( A$ H7 d1 E, n, p' E  l# C
        InterruptInit();+ M  w) e. y3 l8 V' K
- z* L+ f/ [8 n: v: U
        // PWM 中断初始化
8 {: ?1 [: k. h& m        PWMInterruptInit();3 g' l7 S2 ^2 L, q3 ?  C1 l
9 \" E& k  p- o& b# U: `
        unsigned char i;( V1 H! l  \) a8 U/ V# p1 U
        unsigned int j;
% i2 q# A2 T/ {: |' h2 z! [
  i1 n* s/ f4 P# B3 ]6 p        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
$ [/ J! h& e; S6 p6 w8 y; n' L" m        UARTPuts("------------------------------------------------------------\r\n", -1);
1 Z! l! W  h( {. e2 x; Q1 E        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
6 E# I; i2 R: G  g4 q$ ^        // 产生波形# n8 r1 l4 N( Q
        PWM1ABasic(25000,50);
8 o3 L/ i# e% c" G% y. f% a1 m- [, \& W9 P, W; h
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);. D1 }& A% ?4 v  i
        UARTPuts("------------------------------------------------------------\r\n", -1);5 c. F. ]7 d4 \! ~

+ m5 F$ I. W# J1 f# U5 Y/ v2 `7 v
+ B8 M& N0 r  A' n* g. i: @" A8 {' j7 g- ?# h, Y! o+ A
        UARTPuts("------------------------------------------------------------\r\n", -1);/ h/ c) b" e8 v, d8 z$ L: q
        UARTPuts("                    C6748 ECAP Test\r\n", -1);, m' A" P/ z* j& D
        // ECAP 捕获初始化
8 Y& y2 |5 _2 m6 m" L5 \# t0 ^        ECAPInit();$ ~- b$ Z5 l9 H/ V' }' M
        UARTPuts("Initialize ECAP.......\r\n",-1);) S; b8 l& G' j/ ^9 k% |$ F
        for(i=0;i<5;i++)  ]5 Y/ \! J1 G* a: y5 c/ {/ p
        {; l' N/ k1 a; P& @
                    for(j=0x00FFFFFF;j>0;j--);            // 延时/ ^# {' E. z0 q5 Z5 f+ t
                    ECAPRead();( S, `0 P; c( D* }- e" u
        }( |8 \, H- A9 H  E; Q# z: Z
        UARTPuts("\r\n",-1);
& o+ p" r+ B8 k- [; q9 O        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);+ F$ f6 P' d+ a0 P6 B" V  R- J
        UARTPuts("------------------------------------------------------------\r\n", -1);
  `6 h2 e. d; o+ o. h/ {1 J+ W* {& q* ?- X7 B0 g9 I% E: r
        // 主循环
- K3 }9 C  l' t. w        for(;;)) B6 u* H, \2 I
        {7 Y& Y) I& |  C4 D& \4 v$ D( ~
% \( o/ G; ^6 O% w% N' m) J
        }
- n7 i7 B6 P. {* W1 ?8 C}& W! T' b$ r% v% I' i# ?( T$ t

/ c$ W9 M2 n9 e7 W, N4 V5 n6 @/****************************************************************************/
% K* u) D% i* S. l, b) o  O/*                                                                          */
8 t% `+ N5 d4 W3 `( q$ k1 ]+ x/*              PSC 初始化                                                  */
% m8 C# }$ m- s" m0 V/*                                                                          */3 {' b" E4 p2 b1 a
/****************************************************************************/( T/ L% I( R" c: ?
void PSCInit(void)
. A/ @) g8 }( r% V{0 V1 s+ A4 S6 n) W
        // 使能  EHRPWM 和 ECAP 模块/ R6 u6 g% M; P  m8 v' p( P
        // 对相应外设模块的使能也可以在 BootLoader 中完成9 v: \5 @8 l' p# P
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
2 H$ ^3 K- S# e* {0 N8 J& _    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- R) j5 |: ~' v: E}' T: e, J- o8 j! X: Z  u4 K1 b
; I9 u. A; x( V2 ^- ~7 c: L
/****************************************************************************/
/ U8 e9 j. p) `- i$ r! b/*                                                                          */
; u* p/ Y% M, d0 @( j/*              GPIO 管脚复用配置                                           */# l* {- l/ _. t% X
/*                                                                          */$ @0 w  V5 D4 j
/****************************************************************************/* ?6 p( ^) P; g2 i
void GPIOBankPinMuxSet(void)
: o2 D! k/ |) I  v4 K% Q* z{
' M7 V: i# {2 `" e6 `        EHRPWM1PinMuxSetup();, p2 [# q8 J- k
; ]! Y5 X7 a8 t4 [4 x
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)& H* @: w0 ~; }$ [3 b# W: I
        // 作为捕获功能时管脚方向为输入
/ Y8 [- _2 ^( e( |# j# K+ o1 ]7 m        // 作为辅助脉宽调制时管脚方向为输出
6 o4 y+ G$ G9 w+ u3 @% ~    // ECAP2 / APWM28 }+ z7 W* |6 e- X
        ECAPPinMuxSetup(2);
0 S( a; A) j; @# A, a( G  f: \+ m( V! L2 l
        // ECAP2 / APWM2方向设置为输入3 e; U0 p, v5 v& p2 R% b; c
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]6 k9 H2 m! i* a: A2 J) J/ ^- L
}
3 x6 ]7 o. A) L/ l' K. Z) L) I& \2 t7 W& R9 E& f; w: ^
/****************************************************************************/
3 K* J( ?! s1 Z2 [# v/*                                                                          */6 S- R1 o' H% x- H" ]4 Z) o) [
/*              PWM 输出波形                                                */! ?3 G& a  L1 I) q9 K( I$ n2 c
/*                                                                          */
: G7 O9 P6 Z9 J+ V( g% m/****************************************************************************/
8 A$ D# E& x. z) Kvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)5 I" s" ^4 m6 a9 b
{, e1 F; i* @+ P5 J  N
    // 时间基准配置
' k; G# C7 @$ j6 c" V    // 时钟配置" l& D( d) f  ~* l  K1 h
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
/ t+ H3 P8 D) ~- d* |9 e: x: [5 K' l" l% B
    // 配置周期
: L7 ]% O% X$ |) g# o$ d    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,( D) v' o0 P# {
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 X3 c5 {4 {/ h7 `+ ]2 _; ]
: d& l0 h) }) Q) W: A5 d
    // 禁用输入同步信号  @$ X) V$ l- M" L$ E% J% B
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
( ^* @* b, d6 x: l9 U8 g5 w# G1 f, u
$ E6 H8 x. v6 _5 O1 U    // 禁用输出同步信号
; w7 P+ L) s* B7 j5 c    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
7 ?1 W! `5 d% h9 D  N
6 S5 r- V6 S/ k2 c. w) j& z3 O    // 仿真(DEBUG)模式行为配置+ x. R: }1 @9 \
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
  k, ~, W4 v6 e) n! a) b
, n( ?1 i& S$ J- W! n1 j, T0 j# d    // 配置计数比较器子模块3 j0 \! s# {  k1 ]
    // 加载比较器 A 值
% b* \/ h8 z& c    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
( M6 i  g# I7 B; o* A. Q! J                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);# l/ N; P! @8 e4 R3 l6 R
0 B+ A3 d2 q% B/ G) k% }' Y6 l
    // 加载比较器 B 值
/ F) E! Z8 t2 Z# g, s7 h7 C    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,9 `' n8 X7 B# \( w8 [" F" I
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);5 F% y; W+ Z. A% W$ T! U* a
( I2 B4 B2 n; x
    // 功能限定配置(输出引脚触发方式设定): r& R' q4 D: G) Q5 J$ S
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出& s( ~; _2 C' O
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
6 }) @, M3 ?# {7 a                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 x( M, B: T4 z
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
8 C' t6 z) A1 L* K4 n2 r! n7 \  C- A; w9 s5 b; N2 T7 k
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块. \; s, a. f/ a" F" Q" b0 A
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);4 E7 S# p! c- x$ W6 i7 y
" n" Y) s! I0 L1 h. {! h
    // 禁用斩波子模块
! X7 G9 ?" j% V( W, v- H    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 t& e& [0 b3 h4 q" ~
6 B( F, O0 v  Q8 A8 ^5 {9 e+ M    // 禁用错误控制事件3 |3 R3 \# @  _. P$ N' x! C: c
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
1 `4 L# F5 v' x+ h0 t: x) ~- y    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);" E- z/ l" V0 j6 I5 `5 q( M7 O
5 {. ~6 ~7 q/ m1 C# r' v' V  m6 C
    // 事件触发配置& w) P6 W, g! l* B. |
    // 每三次事件发生产生中断
: k: H8 d& Z! J    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);- u4 R6 t- h0 Y
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件) n. E! I$ @& x
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);! E& m* L0 R8 T, z: [+ N  T
    // 使能中断
& B$ S5 w. m7 C- k    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
) N5 B$ c' I" [1 p! i* k- k0 J/ q$ f* G) }1 i
    // 禁用高精度子模块
5 ^) B) G/ t. w    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);5 K9 R! Z" L% `# t/ M  R
& [+ ]; X" l3 v' g+ R
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
. j$ r6 v% P( X* R2 [/ }}7 U. u# A0 L6 ^

" q, r* o# b' Ovoid ChopperWaveform(void)
& ~% Z" _. y5 B. e! n{
6 ~0 s) N7 L% T, X. S    // 50% 占空比
. t4 F) l3 v6 O! X, r  e    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
0 z8 l2 q2 F$ n( x! S# W. r    // 4 分频
2 D* n8 Q3 X8 A1 s- n    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);- @$ s. t, w. Z$ @1 i2 g' j
    // 单个脉冲宽度! p5 {0 q$ Y" b. G8 E& q& C# z* i
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);7 d" P0 V' g! Y
    // 使能斩波子模块
4 t7 ~0 Y2 }( v4 \5 g2 S+ y    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);: ]! G; `& H4 N: `6 h: m. t
}
: J4 Z2 ^: p" f3 t9 e5 w8 |& _. `" n7 `( n$ F: W1 V# l0 `
/****************************************************************************/
5 n" F/ f; x- q% ?+ |/ h, D/*                                                                          */
& L, f# Q# c6 U2 ^" _& l& W5 n/*              PWM 中断初始化                                              */9 e: E; @6 I) {8 [5 [4 v
/*                                                                          */4 s' S( d( \$ x3 ~' ~
/****************************************************************************/; z7 w/ k) e, u
void PWMInterruptInit(void)
; F9 w4 |4 a7 Z" Y" z3 G{
& Z/ p& z9 ^  q) ?6 k0 c9 s' a        // 注册中断服务函数
- Y: S7 _2 m; ?        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
+ q2 y$ W  O/ j7 ?        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
; ]% c) H9 N$ T5 \6 a5 p5 a; I2 o) I9 i, Q' s
        // 映射中断- v5 F; A/ `! l0 k
        IntChannelSet(SYS_INT_EHRPWM1, 2);3 Z& X! g$ R' ~
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);1 S# |1 {8 Z7 Z7 M; h
. L9 [; Z7 m# b' m# }) a7 q
        // 使能中断
/ H: [) I7 T9 ^5 a& u/ i        IntSystemEnable(SYS_INT_EHRPWM1);
+ k  D; }/ N& S        IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 z, L2 [/ S( \% E; U}9 f1 ^) ]* l9 [! h9 j. Y

  x5 _8 Q6 R5 b- U# B% d2 l" {3 x6 s/****************************************************************************/3 c. z; Q) U* D+ }. x( K4 u
/*                                                                          */
! ^0 }, C3 [( p+ e& n7 R/*              ARM 中断初始化                                              */
4 Z7 ?; i; [1 f/*                                                                          */# U0 `" F5 S; S( n3 v9 P9 {
/****************************************************************************/
! K! g4 E9 m" H: v; w6 Cvoid InterruptInit(void)
# Y' P& }7 k) U4 i' ?{
& [- m9 X7 m  X& ~5 @3 H% ?        // 初始化 ARM 中断控制器1 z- M2 C* Q8 U( y. d1 U: f1 D
        IntAINTCInit();
+ @" q$ m# f% ~6 w. U7 i$ `0 g% k4 V* v
        // 使能 IRQ(CPSR)
" ?0 T9 X+ \: M% Y9 }5 a9 N        IntMasterIRQEnable();
$ N1 J& X1 w, }& K& E+ @! \! p: m
$ t+ L& C/ U. N) `  t9 r, N* j: ]        // 使能中断(AINTC GER)
' A3 o' A6 W4 A# J& n8 T& m! O        IntGlobalEnable();
/ b! [  d. p. l! g
1 k% ?  Q' _: `1 S! Q) B- y        // 使能中断(AINTC HIER)
) \5 M( P! Y- r; ]) f. ^) }1 M: p        IntIRQEnable();
$ k* Q. ~7 L& ^' p" R- S}
$ U( Z  L& s+ T2 _" a- N
1 M9 ~* v* u1 |
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
% d& s, B" k! C' H# ~5 s/*                                                                          */
! b% w: g4 Q7 O( r/*              中断服务函数                                                */* j7 y( r- ?3 K
/*                                                                          */: w9 \, m) g0 {6 @/ g6 M" X% j: i; Q4 [
/****************************************************************************/
% n9 Y/ Y5 X) B! y/ p; Zvoid PWMEventIsr(void)
0 |9 |( V8 H, s! D3 V) T* }5 x' T: p{. R& l) |( n% c0 Z% C
        IntSystemStatusClear(SYS_INT_EHRPWM1);4 E* m) `# L) E3 s( w
5 U" W! Z1 P6 N/ C9 R
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);# D7 x, J' R( f
}* l! i* I' a5 G' ^2 y
' M; O1 C) c& f: ~' y( e+ h5 U* q" m/ }
void PWMTZIsr(void)
. J# T  w$ V# _{
6 k% ^* X* F& K. e( F" ]/ a5 m        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);  ^" d/ a* b+ E8 R/ c- |  _3 L

1 R5 m( y) }, Z* C. l/ @- e8 d    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
) Z: Q; O! f& k, `# Z" r0 z}4 x8 ~+ s( [, g" F9 e3 w( u4 F* `

( D; b, l! V/ l  j* s. l/****************************************************************************/
* ^$ [3 |  F6 z0 ?" X/*                                                                          */" q( ^; T: e4 T1 K4 F& v" P
/*              初始化捕获模块                                              */
% B- m* q; M# d: ?9 F; k/ x. \8 s/*                                                                          */
1 y: h' `2 {( W8 C0 N/****************************************************************************/  F9 A9 ~3 D$ K) T
void ECAPInit(void)4 L1 O# D# F6 c  w! C4 \8 s
{/ o5 X. h6 `$ e
        /*-----设置 ECCTL1-----*/' ?( x' [3 `+ m
        // 使能CAP寄存器装载; E" f( L) x3 g% g
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);8 E, k1 X! `' ~: b  A, s; K
        // 设置预分频值.# i& k$ t. Z2 B& B) i9 j
        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 Q% e/ i4 }, f2 N        // 上升沿触发捕获事件
8 e4 p9 C5 ^5 F' l+ ~        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);5 i5 p' ^; n# }$ ]) F- Q5 [
        // 输入捕获后重新装载计数器值.5 O$ l/ m8 I: ]1 ~: M0 _6 ]
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);% l1 Y; l. }' E( }$ z% E

9 S! m, Q* K/ W2 a. E6 t        /*-----设置 ECCTL2-----*/5 o5 M3 P% e, o. Y$ ]; A
        // 连续模式
3 j8 v: v6 v, X% J: X; Z% q' s        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
+ @& m" f" C6 @2 a" q% W- z        // ECAP计数器TSCTR持续计数5 k. L. X3 l& n3 M; ]. y) X+ t% v
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);  l6 @/ Z8 t+ ^3 V
        // 禁用同步输出和同步输入
) F% n. l* d' {* x5 k) ]+ Z        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
" G, i2 `. B( q. q9 P% ?        // 配置 ECAP 2 为 CAPTURE 模式; \8 S1 e6 r! o2 X' U3 i- @0 v9 y
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
4 p0 U: y* \  s2 W! e% [! T: m& ?& a: i9 H: ?
        // 使能中断
9 d# Y3 p: P8 g//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);; S) [0 N* u/ X
}' ~1 Q2 M0 u+ E: ]
: t: m' M; @& }0 i* o
/****************************************************************************/9 D. l9 @; ]" }  \$ g
/*                                                                          */) r0 Y7 q: U( k/ ]/ e; W+ r# B  l  g
/*              取得捕获结果                                                */
2 W8 Q. Q) X5 q& v: Z2 `/*                                                                          */. Z9 T: r8 \" ]& {4 x1 V9 |# _
/****************************************************************************/' k9 c. k% z% I/ I, T+ e
unsigned int ECAPRead(void)
# c/ @3 P# `2 P' o' `, W# F0 d, D{6 q" N) {6 t) D; h" J" j3 V, r  P( v
        unsigned int capvalue;4 u+ U( |! C5 E8 C' ?
        unsigned long frequency;# t9 z7 s7 t4 a/ I/ r! O) S

1 H0 F9 L! O5 u: \        // Event1 中断标志- a, u. m4 K: G0 W
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 @: v$ X: O6 W- k: |1 H( {        {
2 q* P4 B6 s$ d( L* [0 e) k                // 取得捕获计数; ~/ M7 S- X! u, z8 Z+ f/ n
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
) ~$ `$ `5 i4 M, I1 p( m                capvalue = ECAPResult.cap1;
6 |4 C" v& G2 o" p8 h' A8 t( m- u* Z$ r+ ^; Z' P- o" w  E
                // CAPTRUE 模块 228M 时钟主频+ ~/ \0 o1 b, x" j
                frequency  =  228000000/capvalue;
+ v1 Q, U  f2 g4 n                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);& z) R1 [  j  l/ O7 I; _

6 J. @! {# M. h3 H; N6 k) p                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);% S, t/ F& h( Z) h4 D& H+ Q
//                IntEventClear(SYS_INT_ECAP2);
# ^4 k" z1 [; q7 d* K  v        }. n& p2 i7 T, o9 o9 b: [3 R* S
        return frequency;! n; K0 i; E1 [3 b% m
}
9 f2 l8 v4 P7 F, n9 t
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
1 @- T3 @+ O$ F8 A2 u" o[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