嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
; q  X+ q  F2 E0 W6 N5 @
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/  N3 S6 K, z+ k; g) X: V6 K
/*                                                                          */7 e) _& [. l8 m, b7 Z
/*              宏定义                                                      */
! r. B. L! N! c- \, F+ S3 ]/ a/*                                                                          */0 B4 _' a/ R. c( o
/****************************************************************************// j8 B9 _7 z3 P0 A3 f: n
// 软件断点6 k# M1 D3 \4 a& @5 w5 o! l
#define SW_BREAKPOINT     asm(" SWBP 0 ");3 G& |7 N  ~3 d4 o: v3 d' z
6 a2 v& p+ H3 z1 T- I4 K  Y( V
// 时钟分频
  v1 |- I# S/ C0 k$ J: E4 L#define CLOCK_DIV_VAL     228
6 {3 M5 u0 I  V  a! k5 `& c/ |4 r9 ]& K# \' W. U! j) o2 f
/****************************************************************************/
" ~" t4 T4 W" H/*                                                                          */4 z6 p6 ~) V, Q# n% K$ U: j  L
/*              全局变量                                                    */
, @# ^. \2 v! R5 M/ E4 b/ c, P7 o% _/*                                                                          */
7 X2 N2 _4 S. j6 D+ P9 }+ b. Q" E/****************************************************************************/
+ e& M$ [; Z( m( RECAPCONTEXT ECAPResult;, s2 P, k. b7 T% x

& U2 j& L3 y' d# c/****************************************************************************/
. v- a1 p1 _7 ~6 y" ^5 [" X/*                                                                          */( n! W' ?: M5 r4 W4 A% {
/*              函数声明                                                    */
3 N* S3 C& e" s/*                                                                          */+ ^8 |+ d  H7 l
/****************************************************************************/
: C5 x& U% G. r$ B// 外设使能配置/ ]6 X% a. S. u8 |( y  b! A9 t* V7 a
void PSCInit(void);
2 J2 r: S. P4 X& ^8 B* E, X9 z  \7 }6 u$ e" [$ I
// GPIO 管脚复用配置
( R' e; `  X) D  Kvoid GPIOBankPinMuxSet();+ }9 o# ~  q+ u: ^! A# d7 d$ Q
5 h: t4 S: H# W: x: v
// 产生波形
& d( |  B5 m# a2 Z8 O8 }! X2 W3 @void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
  T) {0 d. L( r2 [2 k% B4 n9 K7 y" zvoid ChopperWaveform(void);% k9 ~" U$ }: Y, O
2 C0 V5 X; x4 ~' R$ R- T2 U
// ECAP初始化和读函数
. C# Z  S  G. ~void ECAPInit(void);
- G) r7 s3 o, s& Y0 Eunsigned int ECAPRead(void);
! _. h/ r9 B5 _& t5 C2 r
7 e) |+ V  v' `//ARM 中断初始化) i9 p& u3 G, n% ~
void InterruptInit(void);
; y8 z# E* m* q' J: E3 L# P+ ]3 y" Q6 H+ c" U7 K. p9 g
// PWM 中断初始化
1 _8 k* `  }$ m* _7 i8 `/ z& }void PWMInterruptInit(void);
9 n$ O6 K0 V" W0 r// 中断服务函数
* e6 ]3 ?, c* }// PWM 事件7 [( Y5 [5 u- W( E5 m5 _7 N
void PWMEventIsr(void);* c& I" L+ I' l+ C. ~
// PWM 错误控制事件
# A. I" R& e5 H5 B8 L8 dvoid PWMTZIsr(void);
; \. @2 Y2 V; ]' a5 \4 s5 ?
( N' c- d2 B3 t0 a0 v/****************************************************************************/
+ p9 z. q. T! S* m9 V/*                                                                          */  q* }/ Q5 i3 L" L
/*              主函数                                                      */
7 h! F% `0 ^2 \  x# y& A) ~/*                                                                          */% o9 W7 e9 R7 U/ [" L. F
/****************************************************************************/6 D6 ~8 Z8 Z; G* x. f, f
int main(void)
/ u! q  K: C6 @9 d: k! L8 k{
  }7 U' ]8 ?4 [4 |        // 外设使能配置
' }+ G% E; w  ~$ m# ]7 n        PSCInit();: q: j' ]" ^/ a0 y: Q( V9 G

5 |% X- D. ?$ ~( R$ b% ?8 j8 @        // 初始化串口终端 使用串口2
1 w! u' T$ _2 Q. C        UARTStdioInit();
3 N$ D; v: i" _* J       
4 T# N: E* M+ y2 _8 g4 T        // GPIO 管脚复用配置
1 F# k0 V2 y7 i. V# Q- S        GPIOBankPinMuxSet();
  _. r0 E6 _! h3 h4 C+ c7 `0 O! I5 M5 i1 Q/ v2 k
        // ARM 中断初始化2 n; L: [, J# M4 k, t
        InterruptInit();0 b, E; K6 U. J& f0 k& V; L8 I2 g

- y& `! {! t8 F, b) }9 U+ w        // PWM 中断初始化
; z: }9 p) Y/ U8 l        PWMInterruptInit();
7 W- e: b. j" |' n% ?8 {
  m* j) y% p8 g% \# x8 x5 @        unsigned char i;+ C# \5 {3 k' X( e+ Y
        unsigned int j;: ?9 j/ C+ w( N& r/ x, X
5 o# c: t3 P$ Q5 N" S3 p
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);" z2 k% V& ~; N: P, @6 K
        UARTPuts("------------------------------------------------------------\r\n", -1);+ a9 q2 e) ~. U/ q  Q% N
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
. j7 ]) u4 J8 R, E* ^        // 产生波形
8 c' n# w4 p, V        PWM1ABasic(25000,50);
/ W7 Q& E) }+ I6 e, f7 y( U( x3 q! h4 }/ q& C
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);
5 L5 V, ]2 h$ n1 v/ e/ o" f+ g# F        UARTPuts("------------------------------------------------------------\r\n", -1);
# w4 _, v  R& y8 @' G2 y# X+ r  I4 U5 c
3 y+ Q( W4 x# d  M8 P# H( L1 G4 a
0 |$ n- a3 f5 a
        UARTPuts("------------------------------------------------------------\r\n", -1);8 q0 `- N" D/ v# [4 o
        UARTPuts("                    C6748 ECAP Test\r\n", -1);6 Z% ~+ P, I8 I# b; P
        // ECAP 捕获初始化0 X$ ~. y9 p; t& \4 W0 S- `
        ECAPInit();
* L: H& J0 C6 r* p3 o" x        UARTPuts("Initialize ECAP.......\r\n",-1);
! G2 L( ^) J: h# c% u* a8 |5 X        for(i=0;i<5;i++)
0 Z$ ]9 |1 w- V$ e! h% b, [        {
9 \+ I/ T0 K4 h3 f7 r( G$ E                    for(j=0x00FFFFFF;j>0;j--);            // 延时
- R' P" ~$ B2 z3 X6 V( ~, M                    ECAPRead();' N, T/ Y' P* w1 c3 |
        }2 d3 J7 y- m& E: a
        UARTPuts("\r\n",-1);; G* h4 ]* C& a4 [7 w
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);
6 Q1 V$ a# Q% B' y4 \        UARTPuts("------------------------------------------------------------\r\n", -1);' Q( g6 ~8 G7 P, U+ y
# u1 q9 i7 i; g% E! q
        // 主循环' V4 o: m% m$ ~
        for(;;)
$ m( X. {! x" O! c8 E7 v        {
- l: w' |# E5 Z; c4 `% k. r0 w, L5 b. t- o
        }# e% c1 u, k* c7 q/ C5 E! Q
}! ]3 _+ ]. [/ r7 ~* E( A
0 W. N, o/ r9 U: m
/****************************************************************************/( s2 S; Q) a, G( `  m5 r2 P
/*                                                                          */! }/ G) B8 L$ g: l% L. |* D1 S
/*              PSC 初始化                                                  */$ s& n$ f8 Q6 q2 C6 J# R  r" V) [
/*                                                                          */# Q* n- [6 P  K9 N% ^2 G" S
/****************************************************************************/6 G: j5 _- ~2 H/ X# s; ?# Z% H
void PSCInit(void)* g- p5 z$ h) U2 F0 t
{$ R4 g8 H4 I" ]% X% V* t
        // 使能  EHRPWM 和 ECAP 模块( [9 z& q/ a6 o
        // 对相应外设模块的使能也可以在 BootLoader 中完成0 s' w8 a, V% u' z# O+ n% i
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ C+ Z3 U% a1 \$ \    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);; c. |+ W7 ~, p; g# q! v2 D
}
' n$ s1 \( f6 p- d" K8 l. |3 T& {0 S  G* Q. _8 T7 q6 r
/****************************************************************************/4 c. x6 Z3 A' j- d# W, V; Z
/*                                                                          *// }7 a3 {2 ?; s7 G) ~- m* \7 s1 }$ g- t" l
/*              GPIO 管脚复用配置                                           */
' O+ f3 F0 \# Q- u4 h; e/*                                                                          */
% @8 y& f9 S" ]/****************************************************************************/
2 J# L! N& V$ _+ G6 f; C% X9 Ivoid GPIOBankPinMuxSet(void)& j& g$ Q. E1 u7 L! F" S9 w
{
: N) F7 E( `' d# l4 I        EHRPWM1PinMuxSetup();+ r1 G7 q0 u  U: d# W. K

! a" M5 M/ Y4 B+ u: _        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ E0 N( e8 k3 p# ]! J8 E1 {
        // 作为捕获功能时管脚方向为输入8 ~# f  I& q1 O
        // 作为辅助脉宽调制时管脚方向为输出0 t" i: `& @  d5 B! H
    // ECAP2 / APWM2
; z$ }% P# o. [, \        ECAPPinMuxSetup(2);
: c) i' N  u$ m; q: K, _. B
  O" Y. E' A- M% y& |* M) K        // ECAP2 / APWM2方向设置为输入5 E! p) n& q7 y, F6 d) |
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]: A" H6 l! ^4 @0 y$ X/ T3 q4 Y
}
" ^' T+ L$ i& L& C& ~# M( i/ n( B& k- h+ n+ o* n. D: n; R
/****************************************************************************/
* g7 p& `7 j3 x. D( q; h/*                                                                          */% T* O, }, ~7 f* H8 s
/*              PWM 输出波形                                                */
/ _' O" @- E2 a- t( `/*                                                                          */
6 [; @) Q( E- H, w/****************************************************************************/
% Q% A. q8 }& ?void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)) P" x- h( ]: p7 O' V5 A6 |
{  f4 B! q  K! I; \- d
    // 时间基准配置
: _( F- b+ Q3 j' o    // 时钟配置
# y1 [" b, U7 `7 z" A; E; O    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);  M$ e8 e2 \! F

# ]1 ^6 }. F: C0 r1 L0 {    // 配置周期
8 B7 {5 N' s% E. C9 t    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
; {3 S- j1 s& G$ V: M" b                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
1 K% Z% a3 ?6 |. q0 P( G6 K9 {! m6 r
    // 禁用输入同步信号
( {$ S) @: u- p2 p    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
! G+ {# ^$ m+ t. G5 e3 s+ g) a+ n% m! E3 k  ^
    // 禁用输出同步信号3 m/ B" [; |) o1 H
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
! y3 o& u5 c# y8 V- d3 L1 `+ L  l* F; x. |% P, E2 k; w( [
    // 仿真(DEBUG)模式行为配置6 I, A9 q5 E4 r, y
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);" T/ G9 w( V+ c8 e( f1 b
; U  e# V+ C' P5 |* p: D# V: e
    // 配置计数比较器子模块
& M3 y0 ?0 {. U) R9 P    // 加载比较器 A 值
# L3 q" F2 i+ l1 A    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,, u; q9 R" p/ g. s- \! }! n
                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
8 E% s5 w+ ~/ w
, w2 e+ M5 ^4 i! R1 }    // 加载比较器 B 值
- _5 Q! m7 _% E0 @; i2 H    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
& ]2 t+ B8 ^2 `                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
1 R5 ~1 Q! o7 m. {( X2 U
$ X( m1 `9 ~, [* H' ^% |5 c    // 功能限定配置(输出引脚触发方式设定)
# {. N: a* M: O9 U) J    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
9 i& }! ]1 v3 W9 Y" m    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
, t9 k8 @/ |& V0 m                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
+ {8 Q; [# E+ U# p4 _" X                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);) ]2 F& z% I# v  D
$ K1 B# w4 F: U+ f6 y
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块/ J  O% v4 C& y7 Q
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
4 g5 x* }: I' ?- }; ~) x' e' E. b7 F6 a
) u) E: D9 m, R* l! g    // 禁用斩波子模块
1 k4 v7 n- g' A8 u    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);  O7 J7 ]  K: W& U

! E/ o1 |; \+ o) b    // 禁用错误控制事件
1 @0 v2 D+ k6 f4 f    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
0 d5 J) c5 n7 p+ q% B9 J; w    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
  N8 [* M. z% \9 }7 R0 J
' H/ Z) }3 u9 y7 Z6 X5 ?    // 事件触发配置3 a. T7 u2 |( w3 q/ v& {
    // 每三次事件发生产生中断
; V. L. C+ b& U9 _& \4 [$ b    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);7 R' r' S  z4 U* `5 W( j
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
% j: d9 d# }7 t. k2 |/ b' {    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);; V: v/ Z! _( [, L% J5 U7 D
    // 使能中断9 \) L0 h( `* K  E6 d, b; \
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
2 ?; g. M, c  ], D* M- g
1 Y: M" K/ V3 g. m$ V. Y$ }    // 禁用高精度子模块) Q# {- S/ K$ B$ J
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ N9 z; Q* H1 g: l
( }. a) E5 \$ f0 e0 K$ J/ U    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);: U+ c- b6 y  `1 Y6 T
}+ p2 `2 ^- l7 N9 w

9 l8 J+ K+ z( E. J, wvoid ChopperWaveform(void)
& J; S1 Q8 h; `: K$ h. D{
* }9 d* D2 z  _; I$ k    // 50% 占空比
" W% B' [2 o) u' j& s    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& q7 ?$ N' ~3 q" q! B7 x    // 4 分频6 |+ W6 ~- V8 a9 I5 n' ~# P) C
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
, S& r6 t5 o# ~/ ]5 x! a8 w" B    // 单个脉冲宽度
6 Y' ?' a; N8 F' |6 J7 w% c6 N    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);7 D% w( I; s3 I3 P0 H2 Q$ T: j* T- p
    // 使能斩波子模块: y9 H+ K6 {3 o- m  L0 u( Y
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
, x7 r. w. S8 Q% w}
8 x) k" C+ {0 m" b' K7 x$ k4 q+ r. `; B2 W+ |! l
/****************************************************************************/
& g7 C2 M; }2 {( {/*                                                                          */
) A2 Y; l: g4 Q; ~4 ]/ v/*              PWM 中断初始化                                              */) R8 |% p$ U( C4 `
/*                                                                          */
, P: X7 l% H' e3 `: k5 N/****************************************************************************/
9 a( ]/ f2 d+ ^9 rvoid PWMInterruptInit(void)
) y3 }6 D4 J! n6 n{
) [9 n* `$ D( c  ]4 J        // 注册中断服务函数
4 c2 U7 c# \  A& O+ p/ }        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);' j) ?# B& b  u2 t( W% T1 |
        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);$ M5 G9 n0 h  S2 B" N# B
1 \& N5 \% n$ r* F
        // 映射中断
# r! e1 b9 [  d5 f/ I        IntChannelSet(SYS_INT_EHRPWM1, 2);/ \( Q8 w1 @' a$ u! u2 U
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( L+ @  y: n1 X* s# d6 k

. T; _: c8 f0 @        // 使能中断8 b0 I/ Z6 K9 e( U& U  V
        IntSystemEnable(SYS_INT_EHRPWM1);
( P/ r; \3 _5 D4 i( ~        IntSystemEnable(SYS_INT_EHRPWM1TZ);
4 x# n( N; F1 R7 ?/ ?}
7 l$ ^9 w- b9 ?/ v$ [( ]
# ^# e! V) T* k1 u/****************************************************************************/
+ n1 `& ?  K8 n* T; L; U/*                                                                          */
: e  s4 U/ @: R/*              ARM 中断初始化                                              */
. b# ]$ P& \# N7 I' w3 y0 c! c/*                                                                          */8 u6 ^( _) r, I) W' M1 w* g! _
/****************************************************************************/" `" ?& r5 n4 I1 ~
void InterruptInit(void)" M5 o: U) P7 m& ]% A7 s9 O8 S! U
{
! H& C4 X  x' Y. w        // 初始化 ARM 中断控制器
' C2 J5 I% u; x# l5 j9 ^        IntAINTCInit();
) X# f$ T9 g; R/ A$ K" ^8 q: C, T: Z
- b" l5 R# E; c# |: p2 y: d( S8 Y        // 使能 IRQ(CPSR)" w/ L% l, M- q: |$ w1 J; D) E. ]
        IntMasterIRQEnable();
$ g( V) i3 U* Y6 y6 n6 G2 Q5 y4 n& x  }( P2 B) a4 B' k% G
        // 使能中断(AINTC GER)
+ R, R5 r% ]4 e4 ?        IntGlobalEnable();
; R$ s! r7 @' \% y& N$ _4 w: `$ w' R8 g2 Y# F
        // 使能中断(AINTC HIER)! N. M0 ?, Z1 [' s! q, X
        IntIRQEnable();9 O, F9 H- |, \1 D: H4 V( F
}
" D  i- f( i5 p9 Q7 }, v% I! P8 n! S6 h) e& F

作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/) w0 G1 ^3 b% G' S0 M' M
/*                                                                          */
) `; i4 ?' U" j8 c/*              中断服务函数                                                */. L$ L% U/ l% p7 S4 ^) r# q
/*                                                                          */
" F; Z  J! {! }2 c4 H4 K- Q7 H/****************************************************************************/
+ Q% t$ `/ s& b; ovoid PWMEventIsr(void)0 V9 {( m( |/ j) G9 K$ }! [7 [/ @
{$ E2 E) l2 L1 \$ j9 }1 d
        IntSystemStatusClear(SYS_INT_EHRPWM1);
' g' c& R( e: D) s! O4 \3 n8 Z) F
1 S& J% C( B+ \4 |: p. d    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
" `' b) f" C! P' O2 Z  A}
  m' ^$ m/ D2 J: _: b; p1 i9 {0 ^" N* O% j& ?0 Z
void PWMTZIsr(void)# W6 C  c; X4 a# N8 O8 s( n$ F6 T
{, x8 I; x8 \8 x
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
. a8 ~- u# Q, @6 @; v% Y
* B! u/ X0 a% N* n2 W    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);! {& \7 b1 Y" G' @# m
}
$ f! V2 F" c& F+ @* G& K* j5 d5 S0 y1 U
/****************************************************************************/
4 ~( P9 p& H' v# z+ D+ }2 ]% `/*                                                                          */% e( Q, n/ m+ ]: W  k- s4 {  c1 s
/*              初始化捕获模块                                              */+ i$ `1 F# Y; Q# A) r
/*                                                                          */0 A/ n% N" x1 v/ y
/****************************************************************************/
0 m! s& I9 F' A" Lvoid ECAPInit(void)9 Q3 w* ^) ~5 g+ i7 F
{2 H% t* g) ~- m1 Q& s) S. |; k. g
        /*-----设置 ECCTL1-----*/
- \* q* c- A8 h2 {        // 使能CAP寄存器装载8 _9 J5 ?; @/ M% b8 h+ \
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
* R: H& N6 A; T8 P7 R6 ^% D; ~5 g. T        // 设置预分频值.
- y2 ^- o: D% X/ W' r: S        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
+ _2 u3 U# _: y# T        // 上升沿触发捕获事件( i8 C4 F+ [9 K0 U. k
        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
/ f+ i9 T6 Y7 X: i+ ~& ^4 M, l/ y        // 输入捕获后重新装载计数器值.$ @! y/ J. |6 q( \7 Z
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
$ \; ^/ ~; f7 x5 X# Z: I" |4 m0 b$ [1 A+ [0 D, W4 X# A1 g. q
        /*-----设置 ECCTL2-----*/2 i+ T+ t5 b$ M5 w; q; v
        // 连续模式1 J% i4 }8 I6 n1 k3 p
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);; [+ j6 Z: |1 _* N5 V; \
        // ECAP计数器TSCTR持续计数( c  y# I7 f2 `0 _$ }# k' V8 D
        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);; f# t2 q5 E( v0 G4 u- k8 d" m
        // 禁用同步输出和同步输入' w% F' ~& S! `( f2 e7 r
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
0 p' h4 e. j2 @! w- i+ T  `        // 配置 ECAP 2 为 CAPTURE 模式
. ]: H$ H3 {. Y$ x! \        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);4 V+ R) w2 c& G

5 u  H, O7 o1 Q( \: a! b8 D        // 使能中断
, _) Y( R- {+ J4 Y% ?; r//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
: i2 y% E1 ]# n, L) H" C; D4 }6 w% h) g7 X}' n  p: ?& k1 Y& f$ }, p  G! U1 v
% P5 f$ g' L0 e; W& @8 O6 N2 v- `
/****************************************************************************/
4 b3 g- H/ `1 [) \( I/*                                                                          *// {% a6 E! S; T
/*              取得捕获结果                                                */
3 P$ G/ O9 u  g" u/*                                                                          */# `7 l- a) y; V/ U# B5 Z: X  [& A
/****************************************************************************/
% q, n! u* ^0 X/ `4 F: ^unsigned int ECAPRead(void)
. }: v' ]( |( b% [2 {0 V! Q. l{5 B0 Y& i) P- o% u
        unsigned int capvalue;1 u5 j4 x0 L2 ~* Y$ L1 j
        unsigned long frequency;" N+ O- v7 T, C6 P0 Z6 c

. c+ n2 p1 T% A- G* `! c- i  a" F        // Event1 中断标志4 F  N1 C/ v. @
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)). _7 n# z7 W9 h" e& d
        {
+ X2 M, V- d" `# a% G" W                // 取得捕获计数7 t6 m$ m) \/ i4 t
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
: }3 Y# Y* [) ]8 G7 ~                capvalue = ECAPResult.cap1;& ^& R* p2 e( T3 a, G
2 C8 b; `5 m% a6 k
                // CAPTRUE 模块 228M 时钟主频
' N- H  A( t' r. M+ [* Q$ Z                frequency  =  228000000/capvalue;
  R' E) Z# }. H5 W7 ^$ I% t                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);. r0 n5 T9 i  H- A; ~# c$ S
6 j- J, M( q. e! ?* Q  }9 o
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
1 f+ I" w, ^! [) G- _* H1 K//                IntEventClear(SYS_INT_ECAP2);, \) o5 x8 h% |0 ]/ v
        }
: l6 [; T- _1 d" U% Q1 \+ E, h3 z        return frequency;, _: k/ v, b" L0 C1 ~
}1 I$ t0 L) ?9 h+ @/ e3 {

作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( j- }' t/ N8 ~7 f9 t& D7 z[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