嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
4 @- A. {  [* b
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/* U: N5 Q; O: g/ N4 x: _
/*                                                                          */
9 a( s, X* E- j: V6 O5 {+ U2 R/*              宏定义                                                      */
2 p% Q7 z( y' I+ u8 B/*                                                                          */
$ b# T2 G: {8 L4 ^3 X8 Q( `/****************************************************************************/
2 ^: y, t1 S( @6 `// 软件断点9 x- i: d* [: J4 q0 N
#define SW_BREAKPOINT     asm(" SWBP 0 ");
# o7 j& I! _" O, z/ c2 ]' @- A3 a9 K5 p1 ]' q3 O
// 时钟分频
# R' a, }( E8 V. c#define CLOCK_DIV_VAL     228
- S: U! ]4 N  Y2 R0 L8 s4 @3 k1 }# L% J" |# j& E5 C
/****************************************************************************/. n) S- ~" C5 o1 Q
/*                                                                          */) P( z6 D. l' U. I0 b
/*              全局变量                                                    */
8 j6 x% i6 R' f$ Z/*                                                                          */2 \5 ^6 C+ y' ?% J! J
/****************************************************************************/
7 y6 @5 |8 }: D- }ECAPCONTEXT ECAPResult;
; I# Y) I( x7 s; Z6 w
6 h1 q8 Q$ D! c3 S* ~! w/****************************************************************************/
3 w( Y4 ~7 J* O7 j% S/*                                                                          */, T7 b' E1 J1 q; w' V: [
/*              函数声明                                                    */7 S8 w1 y7 A6 u# Y1 f  w
/*                                                                          */
/ v$ m% U8 \, Y! f6 J: w/****************************************************************************/3 z- a  {3 |3 Z  H% c
// 外设使能配置
3 f) k( V% w5 H* Uvoid PSCInit(void);
; Z  v* N% P" C* r$ S1 L# U; \6 d1 u- H$ y
// GPIO 管脚复用配置
& ~6 |6 Y+ j2 ?5 U2 mvoid GPIOBankPinMuxSet();! [9 L# E( ?; \: _8 t! m

7 l! F9 Z/ i7 O  |1 E4 W// 产生波形" m( e* ~& I# r. s
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);3 {) {8 G- L2 D9 |
void ChopperWaveform(void);- Y9 i, |+ l6 r( g- a
; l" X+ e1 _! r$ ]7 o7 A
// ECAP初始化和读函数
5 Z2 I  G% L9 ]6 u8 k) zvoid ECAPInit(void);9 N! m% `9 |8 m& p! s; c+ q
unsigned int ECAPRead(void);
# c# ?7 l+ \( C8 r0 D) s/ B' Q, }2 q3 {
7 H0 u( q) P5 q. j+ Q" f//ARM 中断初始化
3 q' L5 l; e6 i# `3 t7 j! hvoid InterruptInit(void);- j# o8 x2 k2 v/ O, e
1 k4 m; }/ M: |" a( P1 y
// PWM 中断初始化
7 m  u7 L$ m( ]$ ~void PWMInterruptInit(void);6 m) |  O- F) y( V
// 中断服务函数+ N, F, P0 `' M" M
// PWM 事件8 D! n" }/ s$ {: w) o) i# ^
void PWMEventIsr(void);; |! A/ \4 n1 c) J0 v" l
// PWM 错误控制事件
8 B( @# }. n& b3 L# s% d+ Pvoid PWMTZIsr(void);
( h! r, p5 y  x! c, A
% ]! R2 e3 v- M% F3 }0 q/****************************************************************************/- f! d- d$ N- ~* v
/*                                                                          */+ n7 N% @5 t2 j2 w  T3 z2 g4 P3 T
/*              主函数                                                      */
1 |1 Q' `, W2 A. [( J( [0 ]/*                                                                          */
# J( \" w2 R* H6 x4 W0 t" Z  N/****************************************************************************/2 l3 N6 M6 d( m0 @3 c
int main(void)
8 G0 W; ?+ y6 L1 P/ Y. Z# d$ R( S{
- T- H6 Y* z) N9 b& U        // 外设使能配置0 c  K" ~( K, z0 \  i' c
        PSCInit();
+ i5 @7 n5 C* |) w3 @3 G2 e! R, `- o% [7 r
        // 初始化串口终端 使用串口2$ ?- T% L* O# g/ b
        UARTStdioInit();
5 `6 ~% N* i$ c, C5 V       
/ s; m! p) ?; O! }6 _/ Z        // GPIO 管脚复用配置3 Z+ x% R7 a3 l% J5 @6 ]9 z
        GPIOBankPinMuxSet();- w: v# X' Q+ Y( l+ Y' H! u

. y1 ~) y! X: u: ?( i3 @  i. @# V- ?5 H" L        // ARM 中断初始化, W1 ]; D! B1 S4 I# I8 U
        InterruptInit();
% u( w- H" }  G) a; t* m
) g+ @, q( ~: z+ L7 C# ]        // PWM 中断初始化
. o, c7 R% `9 y$ ^        PWMInterruptInit();1 y/ u4 }: u  ?/ D9 b
/ Q6 W( [" n  \/ x. }
        unsigned char i;  a- I" J+ H, V7 h9 U1 V
        unsigned int j;  ?4 E' B! {3 c( B' m/ Y+ L; I
& w7 w1 j! i3 _; K" }" E/ P; N
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);5 r( D% W+ I9 M3 B
        UARTPuts("------------------------------------------------------------\r\n", -1);" P( ~- `/ w8 `7 F3 D6 Y6 h
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
& N& J4 u1 f9 z0 L$ M; k& c        // 产生波形
/ Y6 ~! V' E3 t5 p5 c6 X        PWM1ABasic(25000,50);1 G5 e+ `0 Q7 M3 w# K( d0 _

/ G4 ^" d/ _! O) R( u        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
# n% g4 j, Y# e0 P2 ^1 `        UARTPuts("------------------------------------------------------------\r\n", -1);
! ^; t2 T! q7 ?% r0 D% @/ U. i, \1 s* X1 W, V1 {

9 |+ x1 W% H5 p* j+ h
) |: f* w- u! v1 g6 G        UARTPuts("------------------------------------------------------------\r\n", -1);3 u9 V- m! R$ L- x& n2 I
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
$ C/ Q* y4 B8 Q0 k        // ECAP 捕获初始化
5 j9 f7 Y7 z( E& A' l        ECAPInit();
* I* q2 _  C- U0 ~# K        UARTPuts("Initialize ECAP.......\r\n",-1);
" h  M% C3 }% t; M! k& L        for(i=0;i<5;i++)" G2 Z8 q# A- ?/ I6 |: a2 E
        {
3 T# x& K) i9 }! Z# N                    for(j=0x00FFFFFF;j>0;j--);            // 延时
6 _: F2 ~0 p1 j; ]6 m( T! B                    ECAPRead();& R3 u5 G! U2 u4 `% M4 j
        }
& z" b7 c3 v2 F- V        UARTPuts("\r\n",-1);2 V) f9 L1 [% Y8 N/ S- D
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);+ c6 {: [0 D% M+ e$ e9 l. q
        UARTPuts("------------------------------------------------------------\r\n", -1);/ q+ G2 F9 v1 G* d7 y

6 `, G4 }; `# V        // 主循环
. F7 o0 B) V! h% S# o        for(;;); W4 ]2 N  P. K; @9 A! V
        {* ]! g* D! Z9 Q$ N
6 P" w  D+ Y3 i3 r2 Z0 I, ]
        }* }8 [5 J2 |, y9 t
}( \# }$ ]9 D( E2 X" U# g
3 b, m5 x5 u1 ^
/****************************************************************************/
( H1 [$ X/ a" Q! s( {2 f5 ?2 ^; @/*                                                                          */& K& k3 }  W2 G  z$ A
/*              PSC 初始化                                                  */+ M0 p. U3 S0 d4 M5 ]
/*                                                                          */
9 q. z( q) R; O/****************************************************************************/
9 Q+ a4 p4 o) x! N. Vvoid PSCInit(void)6 M* ?+ ~5 G4 Q, W+ S4 T, R
{
, s" |" F' ^" A: ?2 ?2 Q        // 使能  EHRPWM 和 ECAP 模块
- z6 v4 r: G& O# Y        // 对相应外设模块的使能也可以在 BootLoader 中完成' z; N% K7 B* S1 \; H' A  k2 t4 i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; g' U2 Y% Q) ^* Z& V1 s0 {! p
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ X* `( W! Z- g" s, t}7 U' _8 [3 y3 w* o
4 W: h2 g$ G* D  _
/****************************************************************************/
) o1 ^8 q! {- e" n' S/*                                                                          */
3 u) U4 e* D+ v  B/*              GPIO 管脚复用配置                                           */
6 I! N& u, M) Z5 L1 `/*                                                                          */' F9 [4 `! e/ z
/****************************************************************************/+ j/ ^7 ?; W+ U, F; E+ b( X$ x
void GPIOBankPinMuxSet(void)
& Q- P0 B+ X  i1 b! h{
5 P% T5 P7 v( C        EHRPWM1PinMuxSetup();
+ H5 r) a+ A/ M# q: `1 w% x
& h2 C5 I+ w, s1 y& z. P% o; {! t: w        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% W! G( |2 l  q5 m# S
        // 作为捕获功能时管脚方向为输入& D' k' v9 H# Q
        // 作为辅助脉宽调制时管脚方向为输出+ m6 @7 E1 ?7 R2 |
    // ECAP2 / APWM2: O2 S! p! t& Q1 N. G' P
        ECAPPinMuxSetup(2);; p; c$ Q0 b6 s' J
: d8 G+ f0 }+ d9 W; M; D  n
        // ECAP2 / APWM2方向设置为输入8 M7 `) t3 u! v- J) R) I# e
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
  g& @8 ~% C7 ]  r}
& s# S7 m5 V6 z0 v+ \- p: H% ^, x& t% R8 B) ?* G; j
/****************************************************************************/% a( Z& c* y. E
/*                                                                          */
- j# R' a7 O: I7 \) `) u6 z/*              PWM 输出波形                                                */5 u  W3 [" C  f: S7 v- |
/*                                                                          */7 C. F) y2 t4 t% z, [6 }
/****************************************************************************/
( N* D' {% }* K% rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; W+ k: a  y( d% e6 D: Z{5 k/ i; h) |: g! P9 Y' W- C4 a
    // 时间基准配置9 z$ C" d6 k5 K0 A  ~5 W8 A
    // 时钟配置
" W) |; A3 q8 C; W) g    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
( o; n! \% {% T+ ?' H/ c. T+ Z) M  E5 ?
    // 配置周期
4 s0 j0 k, r* C" D4 B8 P    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,7 C, n$ @2 N$ B1 D# \+ F5 k! v2 o0 m
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
7 P8 r/ v, `: g! e' N* C  B, O! q4 J5 J) L
    // 禁用输入同步信号
; ~& {- T; ^" v& C  w  H    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);- x; }' y! W6 P: Q/ z
$ T5 Y0 V! i# M- |
    // 禁用输出同步信号
- s. O5 i+ w3 c    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
8 |) B8 R; M3 e& M, b7 k( \
3 c: l, i- D( S- C    // 仿真(DEBUG)模式行为配置
4 m$ {) E' s9 e1 l# R* U" M    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);5 \. ]! {0 j1 A! H/ `# Q0 W5 ]
+ i5 @2 q0 t( m: O
    // 配置计数比较器子模块2 E! |  C6 \% G7 W. f) G9 J0 \+ |
    // 加载比较器 A 值
% Z9 ?( }  v( y% ^7 |& n    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,& L# b; c: I9 l: Y4 M$ @+ h% u5 o8 `
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
; z; ]0 G' e' s$ p+ _# `+ W0 ~! G
    // 加载比较器 B 值
1 X* Q$ `9 o$ _4 h. Y& K    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
/ c4 R$ ~* N4 x' ]) L  t5 z                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 m) `; L- U2 ?6 n- Q' P# A6 Z, m9 M
3 M8 a  k* d; ^, [/ }
    // 功能限定配置(输出引脚触发方式设定)8 w) s3 H1 I1 D4 c( W, q
    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出. @6 w. _# Z! p3 _& u
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,' E3 b9 R5 b% M% I1 J
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: V) n+ t0 G) L' a                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);* W; j# B6 h6 `
- g4 @" A) c/ {" D1 I% u6 B6 `
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
; \6 d& z9 g! N5 P! ]    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);' B; A1 S/ i# L4 {% S# a6 @

: y2 h: j. B: Z4 }9 n; x    // 禁用斩波子模块
. B! q+ S7 X$ O9 u/ X2 i    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);- v5 e: l2 R# i7 z  D3 d' q

# h* U1 y+ v+ q, X2 n    // 禁用错误控制事件
9 X8 M) f$ C) o: d4 ]% {% v    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);+ ^  U5 w1 k4 p% R
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);& C8 @* z9 K$ S
7 o7 L. j) }* j5 O$ _. w" P
    // 事件触发配置
/ \8 [, u4 r4 N: \- X, V, F! v    // 每三次事件发生产生中断
* j7 a1 }( s% W' I) g. Q4 C9 M( P    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( ?8 O6 Z9 t6 U. a! }+ x
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件* {- `( S  N/ p
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);' c1 \0 i: z4 s  h! ~: v& F
    // 使能中断3 E0 q0 y" n' R/ d$ G+ c! Q
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
- U7 v0 e, x5 E% H- |7 f& }) L! C9 N
# ]4 k) \# ]) a; [; m% D    // 禁用高精度子模块; \0 y8 R& ?4 K8 I
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);# b# _$ ^6 d+ R7 s: h

, A2 m: w5 E" G! s, `    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
" u; \4 r  e" m7 O, H9 _2 E}
1 F/ `( b- g! W" s% z; E. C9 S6 b7 O* i1 \+ X! P- b
void ChopperWaveform(void)
+ ?& Z$ \; G! D. v{, Z4 ^3 z/ N4 h9 \$ O4 d
    // 50% 占空比1 L/ K8 F9 @$ @8 S) W) K/ X
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);6 f4 |4 a) V2 _% R( s3 r
    // 4 分频
3 S' }0 S1 E5 @6 d5 |7 D) w! ^3 J0 J    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
1 N8 F) c# L: b% s9 H; v/ W    // 单个脉冲宽度9 M2 l4 I. H9 K0 Z* T
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);6 @6 W# M2 L/ H2 d2 a
    // 使能斩波子模块
3 v9 e$ A0 ^4 w1 k    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
3 [; }5 f8 @5 \7 |5 F! T6 P  q}* p9 z5 m& u" D! [/ D8 m

0 p; I5 n, @+ ^  c% r4 e0 H/****************************************************************************/7 Y9 K: ]1 U3 f7 o  `, z
/*                                                                          */
1 S4 F9 _) b9 J: D/*              PWM 中断初始化                                              */
9 u5 T+ s, q7 X/*                                                                          */
5 n  V7 w* |+ ]& o$ x/****************************************************************************/6 g: r0 s4 a  e5 ~0 K4 x
void PWMInterruptInit(void)
% v4 r' |0 D9 {7 ^% i{8 L& S3 O7 C; y5 U, P0 U
        // 注册中断服务函数
8 R# Z- \/ Z9 m/ s* L        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
4 g9 t9 Y+ O6 d4 L) C        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
4 Y/ j% P* P, G" B
% x1 W  l3 g8 Y7 ^1 {7 l6 E, T        // 映射中断
% L: ]% N' W( r4 y0 u        IntChannelSet(SYS_INT_EHRPWM1, 2);9 I; X1 y6 b+ m( K/ [; l
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
, z# c9 p" h9 W( F
- H) O" i. A: V9 q+ e8 A        // 使能中断
* Y$ f8 r. U$ i+ x6 u        IntSystemEnable(SYS_INT_EHRPWM1);& E# V# A+ x. \. A; V) X
        IntSystemEnable(SYS_INT_EHRPWM1TZ);; b9 ^% X* N- t  z8 g
}: c7 I4 G2 I! b: N* ?
/ S  V% x* g* y5 I
/****************************************************************************/' X% V, J, G. w7 M9 p
/*                                                                          */
+ e7 M$ @' ^+ R6 {( C/*              ARM 中断初始化                                              */
$ U9 q6 c- E9 C% u2 H/*                                                                          */5 R1 _3 Z* Q+ O" x1 Z3 ]/ b
/****************************************************************************/! Z& }, z7 \6 f' M: H
void InterruptInit(void)
3 F0 e' Y. Q' D' o5 M% y{
% X  M( U) }( |1 d* E3 B! q$ a1 }        // 初始化 ARM 中断控制器
+ V- W# m' u5 t$ t: r" B* b8 M        IntAINTCInit();  s" B" Y, v. h6 ~0 q% b0 {
4 i) k6 u: _0 R2 s9 n8 J. \* U
        // 使能 IRQ(CPSR)% z& {. E1 f4 V8 X# Z
        IntMasterIRQEnable();
/ ~5 o3 j8 k* t% _
. X1 K( }. ~: h& s        // 使能中断(AINTC GER)
, A" q3 w. Q% `1 g9 p        IntGlobalEnable();9 [' n- M6 k# T0 @) {

' b5 V7 g# Y' M' i$ p8 x/ H        // 使能中断(AINTC HIER)( O4 Q8 x4 u) B$ u2 W- D  c+ u
        IntIRQEnable();
4 b8 Z1 |3 P3 B$ e6 x* y4 W}& x, q( J9 V7 |3 W6 X$ \& R
& o; O8 V* J& c7 s+ g9 J6 F! l

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/5 ^& ?; d; T4 m0 m  y7 \4 L1 z
/*                                                                          */
0 X" L0 Y: j5 i/*              中断服务函数                                                */# ^3 F' S+ l- W
/*                                                                          */; p7 Y* k) e! p7 p1 O# \1 a
/****************************************************************************/
: ^. o* Y0 {" s6 E! Hvoid PWMEventIsr(void). C% m- N' b$ q, V1 S) I
{
6 X* Y$ @7 n9 V/ L0 E7 W7 M, E" y        IntSystemStatusClear(SYS_INT_EHRPWM1);2 j  c( V7 P' b: u6 m; V; k; T) h* ]

' T1 y. h) ?/ R4 D3 S: e9 w    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);3 W+ n! Q5 W5 `/ N6 u- X* N1 w
}
1 p- `# C2 B2 a$ Y3 A2 ^) X7 r- g) q: q3 m# u; f# n. C( M9 j  e; N4 ?
void PWMTZIsr(void)8 \" ^7 {# {. R4 B
{2 s" M2 F, \" i( ^; }" Y9 \3 R/ h
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
; x3 @7 V9 q# _) y/ ^6 S; l6 S5 @
: J5 X/ w: \- b  O9 t    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
2 b* W. m( u  r8 e/ F* ?( v4 f! B}% y! t; L* @, `% G: C$ S% |
3 y8 q- \4 {( I
/****************************************************************************/
/ Y; [2 L" E# R% P- j. g/*                                                                          */
* z7 \3 z' }/ }/*              初始化捕获模块                                              */& F, l  n! d: R1 Y" ]
/*                                                                          */# h1 P1 U/ G& C" f. y
/****************************************************************************/
8 r/ m* \. ^% _) }void ECAPInit(void)
5 m- i9 z. |/ S0 Q{
7 A5 V% _: X( T8 d2 z  y6 L        /*-----设置 ECCTL1-----*/
9 L( T& L7 L  k5 S6 n        // 使能CAP寄存器装载2 R3 d0 {- X$ v  A
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);" h; R) W& F+ X0 G# Z( z$ L. c
        // 设置预分频值.
  q1 G1 j7 c6 |; M9 O; u        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
" w9 c$ ^7 k( x6 E2 a7 B: a        // 上升沿触发捕获事件
2 ^8 U( h4 L& j2 i        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
  _  n9 H2 s2 m+ r3 B# E! e        // 输入捕获后重新装载计数器值.3 \! x, e# }% p* a: t& j
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);* `. x. y" L- h, W  d# h
  b" f' E- \( ?& [
        /*-----设置 ECCTL2-----*/
8 v$ e$ ^6 o. f8 w& d) f        // 连续模式
: \: U+ |: O* i" D        ECAPContinousModeConfig(SOC_ECAP_2_REGS);5 x3 R6 @. o' A  o& q( ~( Y
        // ECAP计数器TSCTR持续计数
4 R- [2 F; n1 d1 ^9 l        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
: H6 N/ F2 s1 w; g        // 禁用同步输出和同步输入* e1 m5 y) H* a& n" A
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);. |% c" f& w  y/ K) f5 a; H
        // 配置 ECAP 2 为 CAPTURE 模式
0 `& R9 K: y. c8 |' g; X- l6 X! I7 L        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
% M7 r7 O6 Z+ d6 g5 L! @. e' m- T  s+ H: r4 f5 B
        // 使能中断
, E9 @. [! Z$ _( s3 [9 P//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
$ s+ c# y3 [$ B# T, {1 C# K$ @}
, M$ }& g5 F2 @- h3 g: q! c# N4 X- m% w( ~, Y0 R3 E! [% r9 Y, w* f( f4 C
/****************************************************************************/7 Q9 h8 N! I# K9 `0 X1 z; ]# q
/*                                                                          */
1 s2 t, f! N! M, V/*              取得捕获结果                                                */  V* c& k4 M( g: ~9 d! o* J( Q
/*                                                                          */* l" r/ O2 f: [- d& W
/****************************************************************************/* i8 B/ B# T$ J
unsigned int ECAPRead(void)5 I* [6 G* H& E5 H5 M: j
{- x) C) b  n* ~
        unsigned int capvalue;
& b4 m8 H8 w% P4 p! v: f        unsigned long frequency;9 l& x# I1 q7 b" B' c1 {! g
& m* Y/ x) V$ Q* Y
        // Event1 中断标志
4 k6 d5 D( y0 e( C: D        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))3 J' E) D7 W- V1 n- A1 @8 p
        {
/ m. L; d$ t! x; n3 ?                // 取得捕获计数7 r& I0 c6 V2 G" D9 c) [
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);- G5 o( {! e4 W7 @
                capvalue = ECAPResult.cap1;  A5 x* g+ l6 E" Y( r. A
6 P% \* C7 r2 Y- O. U# c& K
                // CAPTRUE 模块 228M 时钟主频
) x; {0 c! S6 S( p                frequency  =  228000000/capvalue;
: S1 E9 z4 c6 Q8 @  k# V                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);5 s) t- |/ s3 w

, v) e/ ]$ |: o+ A- I2 I# ]# \" o                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);# |/ [8 U, G* E
//                IntEventClear(SYS_INT_ECAP2);
# R1 h5 g; R/ A* J. b6 H        }
) o. a% R  c& R9 f# Q8 P        return frequency;& |3 M) F& Z3 D; a
}, q2 Q* H7 F" E' \  E) l: [, {/ d% r" t

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
$ J! |3 y" z5 [, `. Y2 e, k( R[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