嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
' `- Y9 x8 ^0 d# ?' ]
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/
5 _' W# Z; n4 q; l  p/*                                                                          */$ W0 O& v( f  x2 w9 \$ [
/*              宏定义                                                      */+ X$ w2 R6 A4 @) @$ S1 y
/*                                                                          */
( P' D: B( i3 i% z. j2 b( E/****************************************************************************/
  z& c' [! Y% d* J$ \// 软件断点
  L( t, e) j  ]8 K& F#define SW_BREAKPOINT     asm(" SWBP 0 ");
- X& M8 k+ \" e& a+ ]% b, c3 \: k$ O/ p6 Z. k8 [% R4 b
// 时钟分频1 D' R/ V; j; Q
#define CLOCK_DIV_VAL     228( |. i7 w- l* Z1 k& i( Y

9 a. r! O' T# m/****************************************************************************/
4 @6 V5 a' k* A1 W0 J) x- A/*                                                                          */
9 Z+ {8 y0 ^7 s# N$ h/*              全局变量                                                    */
- X" C- R. K, A( V8 |+ p4 _1 m  J2 I/*                                                                          */
' q0 y: b! H! s6 ?' x/****************************************************************************/) r9 w! n1 v0 `
ECAPCONTEXT ECAPResult;
; _% _2 @& U0 C4 U- A. K; i. c" _! P& m* [" t2 d8 e1 n1 H$ @
/****************************************************************************/
3 G- J7 g- c  F8 t% M' M/*                                                                          */0 @; r3 _4 R6 U5 ?1 m; E
/*              函数声明                                                    */
, \7 Z+ o4 K2 |! I& f/ h/*                                                                          */
8 q+ h! t7 A: P/****************************************************************************/2 a% U: s6 O8 g' _  ]
// 外设使能配置$ g  x% g/ @* H8 H( h
void PSCInit(void);
. n/ u* C$ P  C9 r8 Y+ I: V
( t1 E: `, O' K// GPIO 管脚复用配置
; w" I* o/ \, K: kvoid GPIOBankPinMuxSet();7 U. r4 }9 H: @" i* Y, ^( D

6 P" Y( {1 x3 D( |// 产生波形
& s2 ^+ ]; N, l2 ^, ?1 d, \void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: [6 K8 b/ k! ]3 Bvoid ChopperWaveform(void);
( j, C( X, G0 Y' G9 x) L
: X3 g  ^# I& m# t// ECAP初始化和读函数: C' q( Q7 b) U/ b+ G0 b! g
void ECAPInit(void);
. w; d' f, ~$ c) v1 Hunsigned int ECAPRead(void);: `! G2 C& W* b! s; U
' q' M9 h9 {5 d- @# w/ Q6 X
//ARM 中断初始化! t9 u5 _3 |* v, L/ M; x8 _  \
void InterruptInit(void);  B3 K: x: _$ i- ], T
) i. e- h1 t5 d9 d
// PWM 中断初始化
: }, T5 g$ e5 v+ }* qvoid PWMInterruptInit(void);! d% \/ _. f. k+ ]& C0 U
// 中断服务函数9 l3 ^9 J, I' e) l! q
// PWM 事件. o2 X; \: R+ r8 E% a
void PWMEventIsr(void);
$ s2 k8 _* f  j// PWM 错误控制事件
3 F* Z, J6 o5 \0 [void PWMTZIsr(void);1 W% n/ f0 q; ^3 z# [. g

" v' n5 B9 c0 W, H% Z/****************************************************************************/
; ?+ `  z+ `3 @6 x) O$ M. y+ v% T/*                                                                          */4 q& ^: E$ l7 N0 J: Z
/*              主函数                                                      */4 `3 `9 g2 {0 [
/*                                                                          */8 ?: o; c1 [3 Z8 U- _% X
/****************************************************************************/
/ `/ t% h& n) i5 R, R$ x( N2 W- W" yint main(void)
* {+ k5 `- L( t$ A' v{- v5 W' \* E9 M$ I; a. h0 ?* w
        // 外设使能配置! v! ?8 ^/ w6 p9 }0 }
        PSCInit();  B6 I! x! W% L. f# p
! D; {6 c2 S$ ?- r9 \
        // 初始化串口终端 使用串口2
3 O& v6 _5 A) f, q6 P8 e; |        UARTStdioInit();+ V3 W" g( `% g' g- Z3 f$ o
        : r3 b, H2 `  C% I4 d, `2 j
        // GPIO 管脚复用配置
8 o: v8 t5 c" ^. y0 d        GPIOBankPinMuxSet();- I! P) F" \( A1 u

9 D+ p& O: ^$ f/ ]! c% R: k        // ARM 中断初始化
6 z  M; Z' g* u* _+ ^        InterruptInit();
% `' C: p  O) d2 X
4 o+ I! ]% @5 r& a6 j2 s        // PWM 中断初始化
6 n9 {1 b3 E0 c0 D! G, S( `& I        PWMInterruptInit();
8 u8 m/ z. Q+ A0 u/ ?4 F; P
: }& M7 w$ Q9 U* H0 V( D& U- P* ]        unsigned char i;
, E. p' ?) q1 [8 V9 [        unsigned int j;
! R: [- Z7 J3 {0 y
0 ^- f8 H( Z9 w/ d+ F4 u. j5 G; m        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 b  `6 N+ ]; J' J6 E5 P5 E, H        UARTPuts("------------------------------------------------------------\r\n", -1);  U5 q' i- I9 j
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);5 m( c; U* _' ^4 V
        // 产生波形% l& W# d& d7 M  B/ _
        PWM1ABasic(25000,50);
# t0 f  H; y1 _* ]8 k$ i
3 S: M! o+ \8 u% }6 i        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);0 N/ y* \% _! ?6 V( w7 K/ b
        UARTPuts("------------------------------------------------------------\r\n", -1);
0 e' J+ S4 Y- X. r8 Q/ h, o: P8 ^4 j& k8 Z
( f1 L! K/ S$ {: l% w$ {
! c8 n, I7 ^& x/ m6 I& F" f
        UARTPuts("------------------------------------------------------------\r\n", -1);( H  Z. c0 B& h( `" @  \6 `% E
        UARTPuts("                    C6748 ECAP Test\r\n", -1);
% p0 M. H+ I2 D7 `5 l& F        // ECAP 捕获初始化
2 i% R5 w$ L* j$ \& G2 u# y        ECAPInit();
/ I2 W7 Z( ~; c' U        UARTPuts("Initialize ECAP.......\r\n",-1);. ~% R0 y( t! x% V
        for(i=0;i<5;i++)! B; Q9 K: i# q) m! M- Y
        {
; S' l6 p; a7 j& U                    for(j=0x00FFFFFF;j>0;j--);            // 延时+ g1 N0 ^& E) _4 x+ Y9 c" _' S
                    ECAPRead();. C) D6 a4 k2 N: F/ a
        }
$ M1 u2 m& g! T1 r        UARTPuts("\r\n",-1);% K3 s2 o+ n+ O
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
" Q3 X8 K8 W5 y) n        UARTPuts("------------------------------------------------------------\r\n", -1);5 v. @; n) ]  x1 {8 U

- U3 ~+ j% @7 L# q0 e# Z2 C        // 主循环
/ S0 x0 N7 y: P; _! l8 p        for(;;)
9 X) Z3 o$ X" l  Q5 v% ~6 W* }" q        {
& ^7 x2 j9 b# i; F" e$ V0 w) T/ F- ?. N. X* R7 f( K' ?
        }
7 i+ J: U6 f, K: [}+ \6 v3 R6 m9 C. P
7 S+ K) H/ @: F& e) n
/****************************************************************************/6 B4 U7 i2 a2 ]
/*                                                                          */7 N  ^' W1 i/ P/ d4 y6 ^
/*              PSC 初始化                                                  */
* g  m! a; r1 I, P4 Q) O! V+ }/*                                                                          */
0 V$ E) Z5 R( m: v/****************************************************************************/. V: V0 P! ]  V4 c& b
void PSCInit(void)% @& b! v/ x' t% U4 p/ J- u; V; L
{' X8 K( I$ Z& E/ U" m7 J; @  X
        // 使能  EHRPWM 和 ECAP 模块+ o% E9 i# q0 b6 j- t$ a6 K
        // 对相应外设模块的使能也可以在 BootLoader 中完成* L9 l1 z/ a! y9 m# a( P7 A/ a
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" x0 l. _4 T  g    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ Z5 m6 R0 ?0 i7 U& x0 a}. ^3 y/ e* z" l) m+ x. Y0 g

* @& B- Z$ y3 ]0 S7 T' z/****************************************************************************/5 r) j6 w& z* T5 J1 E
/*                                                                          */1 t% A! E% a. s  o3 F
/*              GPIO 管脚复用配置                                           */0 m6 G2 `8 M6 I6 N
/*                                                                          */
# ^% C& B* a# u/****************************************************************************/1 s. f* H: C# P- p5 @
void GPIOBankPinMuxSet(void)
5 J5 r: \( Z' l$ H" u$ J{
; `% _- ^# A; t6 v        EHRPWM1PinMuxSetup();- ~6 J' @7 K6 t1 b& V: _. d. Q
& W% ~) z4 x, f! Q/ N+ G
        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 E- U5 Z7 v  u; y$ R        // 作为捕获功能时管脚方向为输入
; G$ \- q# p% B0 E" G        // 作为辅助脉宽调制时管脚方向为输出+ o0 ~& T/ j) b% J' f$ {+ Y! ~
    // ECAP2 / APWM2: w9 a. x, c' u$ n, b1 }
        ECAPPinMuxSetup(2);( X7 D& V; |; \/ V0 G( ]
! h! Q% u9 f0 _3 Q
        // ECAP2 / APWM2方向设置为输入
% X6 F- z$ y* e) o1 q' p        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
0 u* J' T- q5 E( x}+ U9 Z4 @2 i8 F4 P, z/ H$ I& c
0 v9 x3 H$ b) ^
/****************************************************************************/
1 W6 @" d: ?+ E% Z  }/*                                                                          */
1 F4 j/ e: b2 J7 y0 \7 r7 l/*              PWM 输出波形                                                */
) H2 o8 k9 a  |/*                                                                          */# F+ }- E6 q+ T# S2 ?# I$ z
/****************************************************************************/
, O0 {! `8 ]1 H9 T1 Ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)  P4 o0 V7 K5 w  o0 i5 m& e% `
{
8 j* P! j9 S1 s+ u' n    // 时间基准配置3 `3 g  G% ]& l' y- l  r* X3 W" S6 m8 ^$ h
    // 时钟配置/ B" e5 t4 w3 F
    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* P( a7 L  K$ `. [3 x( P% V1 g6 q9 X$ J( V! q) V$ I
    // 配置周期
7 g1 t6 H" S2 [. H) ]    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,- v6 z6 v2 N' E9 F8 c  s; n5 [/ O
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
& R' a; R3 J! [; d( ?8 l3 {4 j) I" d) [' N0 _
    // 禁用输入同步信号
+ Y; F4 G1 f0 L    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);9 ]2 V) P; B7 m- E; J
7 V0 G7 x; d1 _: V" l3 Z
    // 禁用输出同步信号9 R0 T$ b& k/ ~& S
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 T5 M2 |# n, B0 B4 M+ O! h4 x% d
; s' l+ ]' Y5 |; T% a" d    // 仿真(DEBUG)模式行为配置! T8 A* Q- A, l/ |8 d
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: {# J+ _' w- h% c. Z0 Y
" j! x1 c! i8 e+ ~
    // 配置计数比较器子模块
6 O- Y4 ]3 v$ O, X1 I9 h    // 加载比较器 A 值  w/ `4 c# a4 n' e6 [6 t2 a: Z! o
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 y8 G+ ~! d1 b' g4 i: U                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* x1 w) c6 I) a/ h. d, C2 m$ J9 B) n8 L9 {1 O7 n3 u$ E7 v1 z
    // 加载比较器 B 值7 A: ^$ `1 Z, t# h
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 c$ s) q* V* d) F. `9 c1 r3 Y                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 M% g1 O) y. K9 M
( K) T/ H0 F. O) c    // 功能限定配置(输出引脚触发方式设定)
* ~4 S! }/ ~2 k- v3 M    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ |! a' \' r9 T. x  B8 z; I    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! f$ }) j; A" f0 ~9 _                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 _9 l5 |$ d. s
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" E( H" l3 ~$ m! s; |8 X! @) l1 O8 R
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块
  E. V' v: b1 T3 i% s    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. v, n3 U$ p& a" r& m
( a" x6 q- {( Z
    // 禁用斩波子模块
& @$ e: Z* [' S- M4 k    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);0 i1 D6 f) A* ]. @. B' }  I9 x
4 a. X6 \) F+ G3 }
    // 禁用错误控制事件
2 Q. E5 Z& Z2 J0 D    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);$ b& C2 C) u3 L6 M
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);( B- O  d0 K: J7 B6 o
" e9 c! n, M/ ]; v
    // 事件触发配置( w2 W4 Y) `' u
    // 每三次事件发生产生中断
3 f6 j0 }. I& z$ R  H    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 N) T- M: \4 o' c8 D3 F3 F    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
! g4 G! n- H4 U1 c, L% L! D; a    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);1 a6 D) P4 i# l! E) B
    // 使能中断" E6 i+ f9 R# {4 j6 w; V6 Z
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);! o( `# p) _1 b5 G
. `4 a  n6 f! ]0 X9 ?# v; q: d
    // 禁用高精度子模块
3 m) D. H% j) D+ Y' c6 h    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- t2 }( f, \- u! S. ~. s5 L& r
/ ^$ [. H! Z" G& T5 O/ {' [    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 U5 t0 d8 A6 \+ A
}
# v" w- K" [1 X# p: |/ m+ Y0 `- N1 V1 e. \8 j, h
void ChopperWaveform(void)$ d( ]8 U7 j9 E: K( H+ ^1 e$ b
{
7 q7 I) {/ {, E" E, b" H    // 50% 占空比. P9 x4 E# M! l% h( j2 W" u
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);& c" p* d0 i& R) d; H3 q7 E  K
    // 4 分频6 r" N/ x# V' u) Z) {& H' x8 q
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# z6 Y5 ~' m; J# {7 ~9 Z    // 单个脉冲宽度
" d6 b( G& G6 S    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# `$ Z' d4 _- H8 x4 t7 Q    // 使能斩波子模块+ O9 e- U0 A! y2 b
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& z; F! F0 R0 S! w# H}9 J8 m2 ^7 Z2 W; S
/ B5 i) k) ]4 N$ h' s: Z
/****************************************************************************/0 a5 \8 [$ n4 ~% l
/*                                                                          */
! H6 L. l$ K  n' R5 R/*              PWM 中断初始化                                              */
8 a* J8 n9 r4 j. E- W/*                                                                          */" R: G; v: B9 X. \' M% S
/****************************************************************************/: {4 G* q9 [9 N
void PWMInterruptInit(void), Q- ^1 G5 T9 V3 a; x9 C
{' e$ C# |# G- Q
        // 注册中断服务函数
7 S" k  o/ Q* R, _; Q& E6 y2 }        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);% k5 G, m3 L: G% P! t. Q
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 z' r$ U( l, P4 e" ?+ y# c! K  Q7 T5 F/ q
        // 映射中断
9 v7 `) y9 J) a6 Q        IntChannelSet(SYS_INT_EHRPWM1, 2);$ n/ }" J3 f! @
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; B9 ?. C  N: n- ]) {- b
2 t7 I% `, l0 v7 z& ^, N. o; [        // 使能中断
7 m" y+ x$ \4 T        IntSystemEnable(SYS_INT_EHRPWM1);: a* X/ ]! p1 P2 A# p: `
        IntSystemEnable(SYS_INT_EHRPWM1TZ);6 G# v/ k- G' L' M9 B# z1 D* J* l
}
, j8 U# W8 d  X0 X7 g3 X2 O8 f& j$ f1 L4 u( ~" u
/****************************************************************************/* }( j; A2 D+ L/ L* Z3 g
/*                                                                          */
4 g( c7 G" M- c  E/*              ARM 中断初始化                                              */% X( @( ?1 r& }. @6 X. X7 }
/*                                                                          */( O& D* S$ U. m0 }# D
/****************************************************************************/
1 X1 R, y& S1 _; M! jvoid InterruptInit(void)
' R0 q% |! ^2 m7 X{3 b2 {+ A2 j+ S: ]& @/ Z! N
        // 初始化 ARM 中断控制器
0 E6 r' |: c; h3 B9 `& \        IntAINTCInit();
- b* @! S( U! M- y5 Q9 P
. h( \+ u9 |# r        // 使能 IRQ(CPSR)
6 c. l& n! I6 E) x/ J        IntMasterIRQEnable();0 W! y8 D9 V, M* Z9 @3 f- x: A6 @5 v' O

: b7 u0 x0 B. y7 h        // 使能中断(AINTC GER)
. I' P+ |6 Y5 I( e- T& p        IntGlobalEnable();
# w% L% B2 l4 ?8 m
' D6 X5 G0 R7 j1 g        // 使能中断(AINTC HIER)- X1 \% f- _! [2 s6 \
        IntIRQEnable();5 j$ A+ O- i% `$ H, o
}- D( J& k  L; k: E( P+ s& _

. Z8 M- Q( }# L; s4 y* n
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/) |* l8 l8 g( a: {8 m9 T3 T0 _) q
/*                                                                          */
% C) ^, _4 l+ o/*              中断服务函数                                                */+ q; |2 q( M/ o( s2 V
/*                                                                          */$ S6 b1 b2 p7 y! \( p& D1 ~
/****************************************************************************/
. F/ s5 q2 W( Q  L" n( Kvoid PWMEventIsr(void)7 X* b( f/ ~. t, _4 c" h1 Z
{
. w* ?5 n; l5 S+ L/ @* b        IntSystemStatusClear(SYS_INT_EHRPWM1);% p- i8 K( X/ q/ d
6 i) V6 D/ x/ F1 f
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);' |8 a" y/ Y3 ]9 W
}! X* H; D3 u; X3 j7 w

) P. H3 }/ k+ r$ hvoid PWMTZIsr(void)
5 I$ Y1 h, h1 _/ K4 h2 ]$ E: `{2 s! i  p$ J+ ]% S
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);# c9 L+ r7 P; W" \
0 j. n1 f: |4 s/ U! V
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);! l; O0 O% ~  Y! |; V+ x3 ?
}, B2 _# f* H" q$ O  C

! q  [/ [4 f! U& K% Q- P/****************************************************************************/% r) S/ J3 h& j" ]0 X$ [' k
/*                                                                          */
( D" _5 M0 |- h. }/ z# ?( d/*              初始化捕获模块                                              */( n2 S: }  u! ?$ P- T# \5 [9 l$ A/ C
/*                                                                          */. Y$ n! |  T' ~0 R
/****************************************************************************/
7 ~' {1 t7 d0 x( `void ECAPInit(void)
( X: l4 E. y- j: m8 c, n& [: `2 a7 M{5 X3 t* l9 q7 [' q3 [
        /*-----设置 ECCTL1-----*/7 Z# d! `# u9 O7 \9 n
        // 使能CAP寄存器装载  r" u  m8 M8 k5 v. ?
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);7 X2 {& X. v. }& e7 q
        // 设置预分频值.
0 f- q6 k5 {2 P% w9 [' T: d" Z, M$ ]        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% u. h* \2 X4 B        // 上升沿触发捕获事件
& Q+ D4 A5 t8 p/ r3 P+ F; Z- P& S        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);( ~; ?9 R3 O5 A0 c' A' `( ~
        // 输入捕获后重新装载计数器值.
/ ^- k2 j" L4 _$ R! n# `        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
4 i4 }+ J  ^: O3 q7 `, L& i, d: e+ X, z! {7 Y  ]
        /*-----设置 ECCTL2-----*/
  t) e3 j4 y# E        // 连续模式
1 M, m( T6 a6 v, d) @/ _, G8 E        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" K* k- _* Y, `! h/ Q        // ECAP计数器TSCTR持续计数
; `! X, c& H& m        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);. Q% B' z3 L+ K& t( L. n
        // 禁用同步输出和同步输入
) }( r! r* B$ h: }- Y" _: r        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
* o, p" M" }2 U$ K. f9 f, e! L        // 配置 ECAP 2 为 CAPTURE 模式3 m- P2 w/ {8 q8 M+ Q7 h
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);: P% e6 J% x, V: ^) @
2 ]4 L" u) h* T+ z7 w
        // 使能中断# O4 B7 L7 m" }
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ g7 {0 w, X% y4 D' h}
) H. W2 O. ]% j# J: l+ E$ f9 [% w% S" x  ]5 w0 b
/****************************************************************************/  t  G; |( e* U7 Y* W3 z( d# {
/*                                                                          */
' s# Q4 T# l" G9 ~* a/*              取得捕获结果                                                */
9 J0 b! A6 n2 o2 l1 E$ Y! d/*                                                                          */* \0 k' B; J# N, V7 z
/****************************************************************************/+ B: v1 I1 ~* l- o* F5 L* W# _
unsigned int ECAPRead(void)1 {! T" K6 b( n0 L& [
{; Q2 U# Z: O9 O' z" g
        unsigned int capvalue;
# |- O+ Y  N( M) L9 h9 S# _( s' U) F        unsigned long frequency;. I. h+ Y6 L, a
, K4 l0 {7 V: F5 h; I+ A6 @
        // Event1 中断标志' \1 Z3 g0 S& Z. Q
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))3 ?+ s, c3 a% x( `  F
        {; Q" U" M% T) s, W, ^$ _
                // 取得捕获计数
1 k3 s8 x" ?+ Y. t* t( ]4 O( C, M, s                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( a: d5 m- j: X$ l, Q                capvalue = ECAPResult.cap1;  Z! h+ }0 O9 v& [+ ]/ w; h
" v* F* u  N( _# c3 P4 H
                // CAPTRUE 模块 228M 时钟主频1 K: ?) z. _* U6 T- s
                frequency  =  228000000/capvalue;
! s4 N+ D! L$ f( }3 a                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ h5 ]4 V& Z" b- C/ i  l3 l# L7 F7 _: d0 Q6 B
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);' |; r6 F; \1 K. S2 T4 B
//                IntEventClear(SYS_INT_ECAP2);
' j* j" m6 x( A- ]        }' @& b' R% Y( b9 R& q8 I
        return frequency;
( p' ^7 X, A, b2 E3 R# _/ i}
7 r6 K# f! N7 d
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。# Z% v( H* ], o/ D7 H. 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