嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家2 @0 T3 m6 D! i" `4 s

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
; C) t& R3 y5 r, B/*                                                                          */  P: M9 v& c# ~: T' q4 Q% R6 K
/*              宏定义                                                      */2 o3 D: A$ K5 ]- G
/*                                                                          */
1 h+ n; h0 Q$ r: d. U8 F, w! J0 Y/****************************************************************************/# d* q. @1 z4 x2 r
// 软件断点
/ V' T! T5 d3 U: N+ x' U1 |, @#define SW_BREAKPOINT     asm(" SWBP 0 ");
* N" ~0 d  S- Q) m9 C5 W4 T* ?
1 s  g+ ]/ r, u0 k( c3 H// 时钟分频* G' A9 u) \3 ]2 ]* T# @6 N# }# Z
#define CLOCK_DIV_VAL     228- x1 b7 `1 [% p/ ]/ u

: e. C/ m  v# f4 @; \+ ]& l/****************************************************************************/5 G+ W- e0 t" e8 }
/*                                                                          */' A0 @9 z' V5 [9 c# I
/*              全局变量                                                    */
% s5 S5 X0 N( [, `. H( X/*                                                                          */# r2 A$ ]8 m8 d  M" x
/****************************************************************************/
7 C$ T# ?# E5 \: v3 f. PECAPCONTEXT ECAPResult;1 R' b2 N6 l, x
9 \* ~( [! d4 J4 t/ \
/****************************************************************************/9 ?, ?* Z* ]! U/ [% C8 K. ?
/*                                                                          */% S3 ~& V) X1 {, c# d2 `. h7 Z
/*              函数声明                                                    */" h& p3 f: ?$ E( o" Q! p5 Y8 ~4 [$ [
/*                                                                          */* Y- e6 p& d9 |6 @0 r# ]
/****************************************************************************/
& p) M5 I6 \& }// 外设使能配置
8 Y5 ^2 C  t+ K$ i& p. [void PSCInit(void);7 ]2 J# y2 ~6 D/ P

6 N, u/ {; i3 B9 J3 L9 d// GPIO 管脚复用配置
' _; e& A3 l7 Y3 N& F9 Tvoid GPIOBankPinMuxSet();% {* s9 u& L+ s; {  \# Y, f

$ H% T0 t1 ~8 b6 i, V* @// 产生波形
$ D5 b* E9 M& I) fvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
6 H5 _4 B: s8 u7 dvoid ChopperWaveform(void);# S& S: _3 i0 w* J4 Z
0 i0 Q* V0 N0 J6 {2 G
// ECAP初始化和读函数! ]1 }, y: b; m
void ECAPInit(void);
' n; |! c& c5 F5 k: Ounsigned int ECAPRead(void);
! B& f% c4 v8 w+ i  L  I6 E1 z
9 o( W6 [2 V" v1 I//ARM 中断初始化# @) c, h% s& y3 Z
void InterruptInit(void);
2 J9 Z; v+ }" U+ t7 N
7 q, G6 h( R. N% V+ Z/ E: ~  F/ }// PWM 中断初始化
8 `/ a( x8 O" ~void PWMInterruptInit(void);
: n1 Z7 [& W' N' H% u. q0 x// 中断服务函数
4 F5 t# J2 w, D3 B& M// PWM 事件" \# D. T' Y: a/ w5 }
void PWMEventIsr(void);- F5 Z& f4 b/ I. w2 I. g0 b
// PWM 错误控制事件4 p4 i; z4 \( Z" B6 \" @
void PWMTZIsr(void);! k. r% T. H8 }  \4 r
$ W  `( ^6 ?- B
/****************************************************************************/
! g, s! f& E, r& k. o( ?& q+ r/*                                                                          */
' a" |' y9 q, E( G& R4 P  t6 Q/ w/*              主函数                                                      */" m; y/ d% p1 `- d: E0 S( I
/*                                                                          */
) a. l9 O% q+ J  u# D. c/****************************************************************************/6 {: O0 e3 b' |9 i
int main(void)
" V5 V& Q2 f5 H( g" u) P6 \{  |2 q3 Q  r2 R
        // 外设使能配置$ t& h4 p" d0 F* \- M
        PSCInit();+ i- I! X. J+ u$ G! }
% f! j$ u2 s3 ?
        // 初始化串口终端 使用串口2
) g6 V" |% o9 A0 v  g        UARTStdioInit();( p! z5 X5 }6 g* C
        3 S3 s" V9 e0 a7 w
        // GPIO 管脚复用配置  L  N( [5 ^9 T" l2 Y: |
        GPIOBankPinMuxSet();
* _) `2 ~6 O' I! C
5 b& R2 _- g/ c7 i, h) g        // ARM 中断初始化8 w' D; s; K* A" |! Z3 h
        InterruptInit();
# f) s# b. Q( D1 M7 `, P) F! M9 C8 k* ?
        // PWM 中断初始化
' H0 P) q, ~' k) ~- l, d        PWMInterruptInit();. F2 M+ B) H( R, i

2 m$ m" [5 X) ~* \' `        unsigned char i;
% S; g0 |% @3 b) G        unsigned int j;
' f7 L$ a  J. ~: W1 K$ k& s/ C) z
4 z( `' m  L' r! Z        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);+ g5 P4 N$ g, t) ?& l
        UARTPuts("------------------------------------------------------------\r\n", -1);: [7 w0 {, o- ?- j; _; p/ {, Z
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);! T6 K$ G$ u) f% h8 F5 ]  g$ B
        // 产生波形
. L" s# Z: h8 d& b7 X$ z        PWM1ABasic(25000,50);
2 y: X- u* D3 X: y
0 L; H0 S; [4 q; e) `        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
2 z6 p* A" r1 w2 `5 E) {        UARTPuts("------------------------------------------------------------\r\n", -1);* P  v, }, ?( s0 o( a6 t

$ x. L% Z5 K4 K# r5 D$ Q; l8 u
9 z7 h4 Y% e% Q" |: e" m5 K! V3 B# R# i# v
5 U# P( E9 N( A$ T, W4 f$ C        UARTPuts("------------------------------------------------------------\r\n", -1);3 h* d! V$ d! d0 f
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
; X1 U$ s! Y* W1 _( {% s        // ECAP 捕获初始化
" x. G% i, a. Q; @        ECAPInit();4 V# t$ V5 x7 ?6 f! |: n4 K0 W5 |
        UARTPuts("Initialize ECAP.......\r\n",-1);
, j: s+ Z2 i3 J        for(i=0;i<5;i++)
& n1 @9 a# B) i        {; x3 i# S# m1 K- p8 `
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
% ^6 P. R) a! ?7 v! }. P2 f; E& w                    ECAPRead();
  g: l/ q  P0 Z$ S' Z) Z) k6 U. i        }5 F# |/ Q& I( M4 K/ ?( z
        UARTPuts("\r\n",-1);; W" N. l1 H6 v! |% k/ o; I
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
# \) H  z; O. b6 G4 z) ?- c        UARTPuts("------------------------------------------------------------\r\n", -1);
+ y# E% q. \" ~4 V. R! v
8 W  U2 M9 }# m' E" n        // 主循环/ w5 _% f- {" D% N9 M0 }% v# h
        for(;;)3 v2 @" f; k7 M6 O* W9 K
        {7 B9 l* q6 d3 G! L. G
7 I- {8 ~" B; N: x0 Q7 a
        }
4 u1 v0 h. Y0 N+ Q' G}
8 N# T$ f: l$ b( k  _, O
* g$ q8 ^5 G( K! z' c3 e( i8 b/****************************************************************************/
* P: h( X3 p$ `) m/*                                                                          */
* C/ d4 e- W! P2 I7 q; F/*              PSC 初始化                                                  */
- ^+ Y- h; N/ g/*                                                                          */
5 e) {0 S0 m! \$ s: l/****************************************************************************/& P4 i) Z* b, S# |
void PSCInit(void)8 g6 s: e( i  w% t/ k
{9 b5 i4 d* K4 d) ^# [, u* r. l5 v
        // 使能  EHRPWM 和 ECAP 模块+ c' I6 p% L9 K
        // 对相应外设模块的使能也可以在 BootLoader 中完成
1 @/ o; B; }! Y, U    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);  _6 \. a; ^4 o  b5 D# S# _" j% r
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
! i: q# m' @8 ?4 L* F) B& R1 Z}
( R5 a4 H3 c+ o8 v: ~
: ?( D+ `1 D% e1 V; {7 A7 ?/****************************************************************************/3 W6 V( r  r& |
/*                                                                          */
7 ~* I( F+ U# k# g: z9 y5 f& Q9 J. H" e/*              GPIO 管脚复用配置                                           */; ^& I* |6 O3 b' e4 {- V* q
/*                                                                          */
! _. G1 H- M- I7 t. M# q% k9 ?& o* s8 T/****************************************************************************/
# q. d- R( J2 X7 p# Mvoid GPIOBankPinMuxSet(void)
1 P- L; B/ c2 J. L% U{
. m3 X9 h/ l$ ]1 r1 C$ s* ]% [& v        EHRPWM1PinMuxSetup();+ i5 e5 t3 O# e' `; L3 ^0 O5 R/ K

4 s3 X- A6 Z2 j* g        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
7 C4 [4 L7 r8 O& A        // 作为捕获功能时管脚方向为输入
5 i0 S6 i5 y! [0 H        // 作为辅助脉宽调制时管脚方向为输出
  {& m  b) m; `) u, P* F    // ECAP2 / APWM2
# W4 Z# H  b! J1 v( F        ECAPPinMuxSetup(2);6 Y! B7 Z' Q: b% m* g

6 U5 w& k! I: R: j8 V9 l        // ECAP2 / APWM2方向设置为输入4 Q7 Q7 N$ u; M7 |. O0 e: D: _
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]! `9 o7 P* q0 r. j  ?  Q3 I6 ~
}
) i% z# O$ g1 `* |. Q& h- q  F5 `1 N( a* F! T7 m% z( U; U
/****************************************************************************/
+ V6 Z3 Y( ], z% |: g" z2 O1 U/*                                                                          */& s4 y0 o+ F3 G- L1 K& f6 ?. @
/*              PWM 输出波形                                                */
/ g9 w% y; @( {  ^/*                                                                          */5 N4 h* f) K4 {$ N, ?$ e; _
/****************************************************************************/
- U* e+ Y/ u! U" Xvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)& W$ I" L( i, u0 E, h
{
' q% D1 h5 L' b; V; E: \: h    // 时间基准配置
! a# Q$ G" y$ @, R* J- q8 _    // 时钟配置; c( h4 j7 ^  M; u
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);" t1 J' q5 G+ X( A: H; z* h
/ ?7 h" R( }: H9 y& y
    // 配置周期
; Q; K; c! V5 v" T8 s1 [( r    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
( D3 _7 t/ ^+ }6 t. Y                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);% ?6 i# f8 R+ C! x
' b1 r. y% J/ @5 x4 z! l1 H
    // 禁用输入同步信号4 d) x5 M. R8 D# Z1 H, l
    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);! n+ y! s& n5 E# d7 y
  V2 Z& G2 w  ^/ C( P8 G, g
    // 禁用输出同步信号* @; W# [$ }3 S; Z3 d- ^, U
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);- U$ g5 C; t# q9 p$ \
7 F" [1 {) |* H# a+ w+ d7 G% }
    // 仿真(DEBUG)模式行为配置; _; C% ^: H, O0 E# l8 l6 _9 Q
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);8 l7 x4 c" H' v9 o3 P
2 g1 V; i1 j! x; C
    // 配置计数比较器子模块
6 |0 |% o7 x- Y7 _4 P# X: z    // 加载比较器 A 值
5 H! ?- f- @! p+ X    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
$ q( ^6 y& w6 l" J( w                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);+ ]' }  O: `' K/ i
* ^7 C4 k: k  M/ Z1 o$ {. U" W
    // 加载比较器 B 值6 y$ s4 L. {- @" H9 O
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,( {, n* y" ]) ]- ?; Q! A& [) V
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
. x" v* }% U% o: ^+ @& c- M9 ]: o0 ~5 F* v6 i8 k4 N" U4 B4 J
    // 功能限定配置(输出引脚触发方式设定)( ]( S0 i5 R; U3 k3 n$ h
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! M& B. e' i. _/ `1 i: u1 K
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,, Q" a: w4 B0 V8 Y% D; I
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 o# b( A0 l2 m0 h  C/ j1 v% Z: f" s
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
5 ?" d: N% l+ v8 P
3 S+ _# H' F/ K6 b    // 禁用(旁路,信号直接输出到斩波子模块)死区模块5 p2 k# a4 t1 X# o+ P" S
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);' Q0 h4 ~- N, ~6 A
: m0 i# Y1 G( r5 R# ?
    // 禁用斩波子模块
8 {0 Y! L% \" b: D* h    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);& y+ b3 @+ q% F8 |
& C0 b0 }; A. Z$ {7 T- Y/ a
    // 禁用错误控制事件
5 f- c# k3 F2 t# F% ?# O    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);$ x! }7 Y% o& u- F7 ~0 s1 H* `* E
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
1 R1 A- h. s; ^5 a/ t1 c/ A" }& X" I! K( E, g1 K, ^
    // 事件触发配置# a) ~! z% r* Y* ^
    // 每三次事件发生产生中断# r; N, L) {0 S
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);% ]+ O5 p0 v$ ?' z, l: s
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件0 d. N) i5 A% N: U1 W5 O! b% h7 e
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 j9 Y. Q6 C( v) t$ Z9 E5 x
    // 使能中断
. p' ^' }5 q0 E" x0 i5 r6 n- i    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
0 ]8 U! ~) Z/ r* C
% G- }4 `; i1 g* h; n- c    // 禁用高精度子模块
+ T$ H+ n. Y' ^, w& ]$ i0 n    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
# S% c& c" A% Q- v% h% d6 m1 ^1 z& ~3 [
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);* k/ Q" ?7 o: ^
}
: @  H4 r! _: X3 Q
+ N- Q0 H# j0 R$ evoid ChopperWaveform(void)1 F+ I  L0 I  X6 }+ ~
{
0 n$ o/ d7 l! L" C$ O6 y) H$ ~    // 50% 占空比8 I8 i) l( N4 e9 Z
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);4 g9 a% m* d. o" A# k, r' V+ B
    // 4 分频
# l  N/ e$ U5 T% }: s* u    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
* L2 W* U1 r& s8 [1 u    // 单个脉冲宽度
; f/ i1 k" G  d; o# S, c/ b. V    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
. U1 S# @7 b. z$ p; d& y    // 使能斩波子模块
6 c0 t5 E4 O' l8 f, R0 d    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);$ N! ]' T% T+ {' ?' u6 W
}
2 ?2 }% z' V$ J  F% U1 c- W4 V- n& T: o& b! X4 a: B7 L8 m' _
/****************************************************************************/! i4 [1 O* V" |4 c# A! f( C3 k
/*                                                                          */! ?5 X6 Y5 t. n3 ~
/*              PWM 中断初始化                                              */- A& d$ u% V# y0 }; g7 T6 t* T
/*                                                                          */
5 i& K+ B/ E9 {% C9 T  o/****************************************************************************/
% |3 r7 g. [* o1 V/ C2 Qvoid PWMInterruptInit(void)
# q1 A* }3 w: N  m. c. r, h{  b4 N$ k, G: z5 ?# y
        // 注册中断服务函数
# P5 ~4 S0 w; S6 c; y        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);, r' q1 T; a3 E2 }! F3 _) E) m% l
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);5 S' ^/ U3 D4 g& @- C0 ~3 E: E
. w9 B7 Y+ s6 A* g# a
        // 映射中断
# _) A+ s0 I) g6 {& A        IntChannelSet(SYS_INT_EHRPWM1, 2);2 p) F- x- Q" n& C
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
$ N; r4 Z- o1 v' W0 o& f5 `- B" P6 A
' D3 T5 U1 i$ _; M- j. r        // 使能中断
0 a1 J: {, u# g+ P# F        IntSystemEnable(SYS_INT_EHRPWM1);
) p7 {) g3 t' A/ X3 y        IntSystemEnable(SYS_INT_EHRPWM1TZ);2 k# z: s: ^$ W) H# F$ t1 e
}2 a' b5 h. |0 H; d

! v; k; ?' \0 {. Y" n* I% Y2 p0 N/****************************************************************************/; q; P) D$ Y, ]2 o! k, B2 \
/*                                                                          */
4 V9 h/ g4 P+ e( p, V* S2 Y3 M! A& S/*              ARM 中断初始化                                              */
$ N; H4 c6 W( h  h6 P4 w/*                                                                          */
9 w! d& t8 {. c' e( g/****************************************************************************/: R# [4 E. I* t' }% O
void InterruptInit(void)7 |) [0 \2 B& P1 A' c) L: n
{
  b$ N* S1 W3 w* U        // 初始化 ARM 中断控制器( z/ [8 n. H8 ?, v
        IntAINTCInit();
5 d) j; k% Z) z5 Y0 R0 e  f$ l# H6 ^. A9 ]" e: t
        // 使能 IRQ(CPSR)
) X# e7 X# b, n- o        IntMasterIRQEnable();0 M% B2 m& W5 c9 ]3 o$ b

. g& |" }7 L6 a1 ^/ H        // 使能中断(AINTC GER)# R# J  X6 e) c# C
        IntGlobalEnable();
3 ?% V# N( B" ?$ n  ^$ z# ]7 B& X6 g" Y2 x4 D6 m
        // 使能中断(AINTC HIER). m$ R5 i3 M! m+ F% P5 W# j& ?( Y
        IntIRQEnable();
* R4 u& F% G6 q- U& O}0 d3 X2 N5 S4 w" s$ }9 F
5 D, z; X  d, X0 ^

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/5 D7 F! \9 E; \; q# F
/*                                                                          */8 p, c0 Y5 d9 I* u. ~9 G) y& ~8 X
/*              中断服务函数                                                *// _# k/ R6 E2 f9 X
/*                                                                          */, s% n6 v7 _1 I/ _; Y0 v* I$ A) T
/****************************************************************************/
) D0 W8 U$ Z+ ~4 \; Q1 kvoid PWMEventIsr(void)
' k- [" ^5 g+ V, Q5 `{! S/ x9 N) O5 s+ {1 @% J& a# l
        IntSystemStatusClear(SYS_INT_EHRPWM1);1 H1 l, P6 L' j5 I: @1 P& P
; D% K' g; @0 K# K# V  u2 O* P( L9 Y
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 Z1 g" P) {; \9 P4 z}3 A& S% v4 _5 i
& f$ t% }% _1 \
void PWMTZIsr(void)0 J. E  }% d; `( Y  U( [, t* A
{* z' z# i5 M& N0 E* r# m
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);: P5 O4 C2 {8 Y1 F

7 c- B( g0 f" \* m    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);# u6 Z0 _/ L3 ^' U( S5 H
}
$ M6 q, I! [5 z4 G; |" V& F' s. `) y# V' I, i9 k) _" Y3 a
/****************************************************************************/
. M0 G+ }9 k2 \8 V( e: K/*                                                                          */  U) B" w& [% s% H
/*              初始化捕获模块                                              */
' S% `+ w) ?/ b5 ?9 q5 Y5 j) o/*                                                                          *// f  [1 o. C7 T# u4 o
/****************************************************************************/
' p' v+ e2 b0 x+ \void ECAPInit(void)2 L- g* a8 t# P/ z
{7 S$ K: t5 b+ v, y; [
        /*-----设置 ECCTL1-----*/
& |  {- c# A" M: h        // 使能CAP寄存器装载
+ I1 A$ V" ?+ K2 j5 s' L6 z( J        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
# Y: Q& e" [# o) g1 j; ?4 d! M* m        // 设置预分频值.
+ M$ d) n# x1 _$ _! F# L        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);# z) \& g8 U, y' _* w
        // 上升沿触发捕获事件4 s3 x7 s+ P' h" t2 I6 `! V
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);$ i9 E0 g9 l1 m6 w. B- N
        // 输入捕获后重新装载计数器值.
& J1 k5 c# |6 u1 J* B        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
0 K" |3 L# q, M- x* ~4 u/ }8 E+ V4 U5 a" K4 w* L7 N0 P: F
        /*-----设置 ECCTL2-----*/
1 g' W$ b; f  [6 P8 i        // 连续模式4 Z; h5 c2 h+ C. z! h; ]
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
9 k- }/ f* f, H7 t' \        // ECAP计数器TSCTR持续计数
2 N1 o' ]6 X2 B+ [        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);, }) B# Y: Z$ w1 ?. T
        // 禁用同步输出和同步输入, n: E' A: C/ L* t) o' J
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);4 `2 ]5 ^& K' G
        // 配置 ECAP 2 为 CAPTURE 模式- i* p4 m$ _% l9 m* p/ A
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);& L6 T; e8 v, E3 q5 H

0 t# p. k3 V2 G$ ]& Y        // 使能中断' v' s+ C! V1 [8 d& L
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);# B* U( d6 a" V# W
}
  a7 {/ Q: E3 {* c, V7 H9 t
; U! F5 s# ~* [8 f' E/****************************************************************************/0 N' A$ J0 U* s5 ]3 D  D
/*                                                                          */
4 W5 q  J' C9 b4 ~7 ^6 Q- f6 S+ e/*              取得捕获结果                                                */% h( Q# I+ _; W) Y3 G
/*                                                                          */
. c* _- D) x9 h- W6 ~$ h1 H; w/****************************************************************************/
# G: Y( J) V: Aunsigned int ECAPRead(void)
; x$ c: F1 b2 O5 j: z7 s# w, l. ]{; b8 f0 S# ]9 Z5 M7 q
        unsigned int capvalue;2 N) u) r6 k+ W6 x# w
        unsigned long frequency;
9 R& M$ N4 u- `2 n  O4 n' o. R$ C5 G$ p* l1 i: _
        // Event1 中断标志! ?& ~& O3 Y, ?
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
9 S, x; Y7 h7 S8 T  h        {7 [% R" J$ A& s" z
                // 取得捕获计数3 A) Z$ A7 c! C) e
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 k3 h6 ~" ^" O: L                capvalue = ECAPResult.cap1;
) M! O1 S/ C4 J1 E
: _& a3 y. i8 g0 Y- N. l9 N' r                // CAPTRUE 模块 228M 时钟主频5 v0 P8 _3 i! p  V
                frequency  =  228000000/capvalue;3 x% a; v" K/ l' I/ ~( Z5 @
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
1 @. H* X3 s! m. ]0 c/ a
7 G3 ^0 x7 X. A2 s8 X                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);5 P6 r& M; M+ b: b9 Z- {; W. A
//                IntEventClear(SYS_INT_ECAP2);
9 W2 w) k. I7 g; P9 O# O( q* n3 |        }, r; g1 i! g# L
        return frequency;
; R& o+ h3 S, B1 A% _: X}6 \3 N. v+ f( |( g- s  W

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。4 Y# r& W# _/ e( {9 \6 i+ 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