嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
- T6 _, a- `- @& P2 Q8 S
作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/. |% M6 y. \& ~& v
/*                                                                          */
+ u! A4 f! e% J( W# m" b0 v( j/*              宏定义                                                      */2 z, a1 N, K; `0 h7 C- H
/*                                                                          */0 P! v. z9 i4 M3 H6 r; u
/****************************************************************************/
# q5 V: ^; V4 ^( W2 i- b! \  J// 软件断点
- R* [, p$ o7 E0 V  ^#define SW_BREAKPOINT     asm(" SWBP 0 ");
+ ~& _3 |- @( _1 b
- f$ r" ?/ x' x, D6 M// 时钟分频
5 |/ r9 k" B+ j9 }  F( I9 l$ @) v#define CLOCK_DIV_VAL     228
& N' i. w% w, D0 P; l: \7 t# L0 Z: F* S
5 o2 h$ c( j: A$ K5 ~/****************************************************************************/
% q, d( b" J5 _, u' x4 m/ F/*                                                                          */9 c" x2 I2 {" J- n2 Z& X6 k0 ~% z
/*              全局变量                                                    */( X: M4 |8 Y# L" a! U) U
/*                                                                          */
/ d7 X( y1 O+ |$ D3 o) k2 h& j/****************************************************************************/
* y8 ?  O6 M5 B- w, oECAPCONTEXT ECAPResult;
" w, u. s; g1 h6 }2 U" G+ Z) W  i4 \) Z! |
/****************************************************************************/+ M0 X8 U$ x, x; M( R
/*                                                                          */& M( F( m9 E4 V1 r6 R8 q& n
/*              函数声明                                                    */
8 g( ]' w. k% Q/*                                                                          */
# z( R+ E1 B( C/ T: y9 m2 E/****************************************************************************/
9 C+ `* P( i0 g' Q" J" R// 外设使能配置
$ b0 e: @& W+ d, svoid PSCInit(void);0 v+ I: [8 W5 p- m% h

/ {  W- Z; L: a! U$ T  h+ r// GPIO 管脚复用配置
. q; P( N) Z$ R" k/ b4 q4 k. Avoid GPIOBankPinMuxSet();
" v, ?/ k8 a; v1 e; a  [
* m' }, o) k: E8 w7 e; A. M// 产生波形7 ~! a; \" l& R% l
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
, B$ m' ]4 [6 fvoid ChopperWaveform(void);
5 d& J1 E9 |, h$ Q5 K/ {1 Y: n; K7 ^) E& r' }8 M; m5 I  e
// ECAP初始化和读函数
! f. c  s" ^6 ?9 x: Q- kvoid ECAPInit(void);! i7 c7 X" d% c& C3 c4 m; M
unsigned int ECAPRead(void);2 K8 _2 _* ~2 z( h, O
# ^7 o4 V, M) q3 l
//ARM 中断初始化5 }! r! u; Q! E$ A5 ?
void InterruptInit(void);
8 H8 F0 y4 g' W" r- B: \2 [& ~- G- A8 O# Q* _2 v
// PWM 中断初始化8 J9 p3 x% t2 D1 k" h
void PWMInterruptInit(void);
# g: |+ s6 m" b& M! Q// 中断服务函数
/ d! A' q: E4 n* t// PWM 事件
+ M& a% k: E) U; C5 M6 g3 g2 Svoid PWMEventIsr(void);
2 }; C/ J3 L  l, \+ |; e// PWM 错误控制事件* z$ |5 G" n& N! o, S: A; n. v' X
void PWMTZIsr(void);
9 z: M4 Z1 `, s7 W
# C% Q. a- G) M5 g% H, e$ [3 f/****************************************************************************/
) P9 z# j+ B0 N6 c$ F  v/*                                                                          */
9 U8 ]) `) j  V/*              主函数                                                      */
3 x' t: |8 u0 _/*                                                                          */
1 o3 o7 ]# [1 u) O) ^1 ?$ Q+ `/****************************************************************************/
6 z: h; E* \9 o% P% a' ]9 e" L* bint main(void)
- S1 r9 ?) U7 p9 b# J{
; n& ]* H  {2 J+ ^        // 外设使能配置
' i+ v0 l! X5 _+ ]0 K" [& h        PSCInit();# W3 w7 j2 @0 g, T1 i: ]

1 r! t' D- X5 L        // 初始化串口终端 使用串口2
" b) Y0 r" s* G" r2 z        UARTStdioInit();8 a  V+ S0 \1 y" g0 X1 m, c6 ?
        5 y5 c1 R( v( `/ l; M8 G! E0 y2 o
        // GPIO 管脚复用配置
4 R$ D  ^5 y5 a. l% H8 X        GPIOBankPinMuxSet();: P. o6 F$ Q0 l/ W1 m2 I
. N" x* k. n0 P- m9 K+ `- u# u' n
        // ARM 中断初始化7 w8 t( F  A. u" C
        InterruptInit();# f( `% y& Q; Z/ }

) h+ r, h+ n: H) X- r; M) ^        // PWM 中断初始化
7 S& U; |0 U; H6 y5 j- G% `" \6 {        PWMInterruptInit();
" s  U5 p. K4 h3 ^0 g: \7 P# J4 v# B5 z8 S; h9 N
        unsigned char i;
( X' [0 P/ F- B' H9 f5 P& O        unsigned int j;/ C8 s4 l) |5 k
, Z, ]$ W) {0 C
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 [1 y/ }6 P" d: ]        UARTPuts("------------------------------------------------------------\r\n", -1);
9 ~1 `* y( p) c" x( Z        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);
% @3 h6 |8 C. T  `% Y" Z        // 产生波形
, a! a- }+ X/ N3 F" x        PWM1ABasic(25000,50);* ~: A  Y9 r6 I9 Z/ [

3 u9 v' ]2 v7 a        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);/ U9 F, u. y2 ?7 K- I( n6 o) w' k$ z
        UARTPuts("------------------------------------------------------------\r\n", -1);
6 s% u* w, N9 Z7 d% j- y' g1 ^3 b4 E# c3 R  V2 m# J# U

/ }7 E# h4 X+ }! h9 n
8 ~0 \/ o, S" |& p: W1 |1 P: }        UARTPuts("------------------------------------------------------------\r\n", -1);+ E2 e' Y& o7 b" a7 X; S2 e6 I
        UARTPuts("                    C6748 ECAP Test\r\n", -1);3 m5 ^0 f5 @( T, N0 i# p
        // ECAP 捕获初始化
! {7 R# c1 |1 _8 x        ECAPInit();  q$ S4 Y2 E" M) T& u- I
        UARTPuts("Initialize ECAP.......\r\n",-1);
* ?8 L. B8 R0 D4 s: j' Y( ~        for(i=0;i<5;i++)/ L% E) n  _6 F2 P
        {2 F4 z- R1 v5 p  F
                    for(j=0x00FFFFFF;j>0;j--);            // 延时
; k# |/ A$ G9 L% s1 s                    ECAPRead();8 C% l  N! K2 T0 M" }6 M) h
        }
% r+ T' D& e7 Q. c( ]- @        UARTPuts("\r\n",-1);$ p. Y, |' H( G" x# C# R; E
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);$ q% D7 k7 e9 W3 \6 B! p3 s/ @
        UARTPuts("------------------------------------------------------------\r\n", -1);+ U% T- ?% ]# F3 _# n0 f$ O" D/ l/ C

" i3 L% `# h* k& K+ V* o+ P0 T        // 主循环) g! H' b% L: U9 v  a" w
        for(;;)
9 K. \2 `7 ?# Y5 V6 ?        {
4 P5 D3 v2 E" G6 u2 x
& \" g% |: w& q, Y$ s9 x, k/ ?! G        }) S  p( ~7 T8 v! C
}
6 \5 M0 b( T& l/ F3 P7 w1 X# i
& m1 c' L# Z& a3 m* w( m% w: D7 s/****************************************************************************/
2 U2 e7 x, P! E7 A4 @/*                                                                          */
& ^7 a) W7 T0 k3 B6 [9 C0 G+ I, L/*              PSC 初始化                                                  */, Y9 T, V. r% f0 ~! }$ L# r
/*                                                                          */
) I3 H' P. @% T/****************************************************************************/1 \' {1 M7 C% |
void PSCInit(void)
& e& ?! w5 B& z7 f) m{
$ y! O" r, [3 A" ^        // 使能  EHRPWM 和 ECAP 模块
8 P! s+ j+ E$ M+ B        // 对相应外设模块的使能也可以在 BootLoader 中完成
! f2 }* G6 @  A    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
5 ]1 w. M. \. a1 j- {5 A: k    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/ i( i0 h1 G9 q8 P; e" T7 w9 ?}
/ |; R9 H/ |4 _
6 e9 G  C5 n; l+ o  J/****************************************************************************/7 F. Y) w9 e( a# q! `. s
/*                                                                          */
9 l8 p" v. ]/ J/ X6 a2 N/*              GPIO 管脚复用配置                                           */7 K5 V9 g" |( ~  X$ [
/*                                                                          */8 r1 R/ H3 z8 f: W1 G
/****************************************************************************/: [1 {' O, T  A: [# n9 K
void GPIOBankPinMuxSet(void)
, U9 A5 ?4 ~0 r2 e9 H3 T7 H{& _$ q$ _/ W3 H& x$ C; D
        EHRPWM1PinMuxSetup();
1 v' ^  ?* d' Y) ?) H4 p: Z
7 {* {- l, ^4 B  Z# Y        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
- ]4 [$ z0 p9 p# `        // 作为捕获功能时管脚方向为输入: x1 ^! t% F7 Q! E4 L0 K! Z* |
        // 作为辅助脉宽调制时管脚方向为输出
2 d+ H4 ~; M7 t$ w8 \( F/ V5 G    // ECAP2 / APWM2$ |4 C! a( q4 s' k; Q  a# U
        ECAPPinMuxSetup(2);" l+ U' A5 I% ^9 j; H

2 x% [9 I7 [1 X3 E' s. ~1 n        // ECAP2 / APWM2方向设置为输入! O) u0 F5 }& C5 n& {1 Q6 c
        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
8 ]8 H- w) I% c) A) x: N3 e! E}
  S' d3 q. ]5 x' y4 z) e+ _; _
8 s! f9 }) ]4 g: d- V7 S  v) b; m. x* f/****************************************************************************/
' p& ~, G* ^4 G6 A9 _/*                                                                          */4 P# j1 ^) y9 e& i# {8 R
/*              PWM 输出波形                                                */
; z' q: f1 @% L' f/*                                                                          */. V7 @7 P  O  I; v. c+ s
/****************************************************************************/4 j; A2 }! V( E: N
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 W( h' u. @* l% Z! T  D6 T0 e
{* T# ~. ~! w4 ^2 b$ C6 Q) W
    // 时间基准配置
0 F  l! H! q0 D; @' t7 s4 z$ z    // 时钟配置
9 K; [" S) n% ~2 N    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
" p# w" c: {) O6 x8 H
) Z% j+ E2 L8 h; S+ E    // 配置周期6 X* N6 o4 w0 w" f3 W. r
    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
* A0 V' S3 c/ H( S1 n                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);5 L; t) X) P/ R2 p
: Z/ N4 R1 D( Z" u, h) K/ l- J
    // 禁用输入同步信号
! E: v! Z  i0 K# P    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);. m+ s/ q4 S3 y! a9 W" L
' w0 b$ X! T3 f- x
    // 禁用输出同步信号& }' ]  x; l! J% W. v0 R
    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);* o; k+ v! X- g5 o" U8 f7 Y$ E
" P+ m4 D$ l2 _; t) Q( i+ ~6 y
    // 仿真(DEBUG)模式行为配置
; a  h0 y1 l" T- Q& ^% e8 @" p    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
2 F0 N8 F2 H2 L: T: Y4 D5 q  `2 s4 C0 a  l" x+ e, I* b2 e4 H$ L
    // 配置计数比较器子模块
& W7 V1 a3 s3 U0 t0 v2 _    // 加载比较器 A 值
5 x: [6 [' Z' U' M    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
% _7 d! d) }* q/ ^0 T" Y                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);2 M7 j. a9 n8 H, A

# X" _$ p/ y3 {( ^( N4 \    // 加载比较器 B 值2 w, C% j) v. }+ X: @
    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: `- `8 f! }: V) n& L, Q
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
, N! K* ]! i# y, g( M9 H) v2 V3 U  {2 P/ r
    // 功能限定配置(输出引脚触发方式设定)
$ O! h8 R: @  J5 E2 i8 u! j    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: B6 v9 S4 c, t, B
    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
. [1 E3 S" |: `# L                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,( l- J- \' ?2 T7 K, w
                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
6 _9 a* Y& e4 R4 _5 Z
4 V# }, D% r  F+ S    // 禁用(旁路,信号直接输出到斩波子模块)死区模块6 j1 L, O, ]6 c2 w
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
, f. ^" C3 B8 e  s+ A/ \+ _7 ], h6 a# r" N9 w0 v+ _: l5 u0 _$ h7 i
    // 禁用斩波子模块0 ?, y$ O! ]2 m
    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 j$ h' [( A  E% e" Z8 O# U! D5 a$ {/ V% t6 x" l  \2 T
    // 禁用错误控制事件6 Q2 N' V$ i4 F! N1 e2 ~1 y
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. b# x" |- r) i$ n& {% q    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);. B6 H7 F8 A9 g) J( s5 @
, s9 M* ^3 M( _2 j, Q& C
    // 事件触发配置5 v" r' E% [4 c# Q1 @# w& O& l; I
    // 每三次事件发生产生中断( c/ u/ f5 v2 U# n0 m6 s" a
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);: A3 W, m  b' ~1 t5 |8 Z4 }
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
, n* B$ P: P; ?4 E# {8 {2 h$ {    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
/ U' @; H0 `' {8 [" K0 U    // 使能中断3 U/ h' B  _3 i! w  ?1 W# Z- \
    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
+ J2 b7 `! [4 r) n6 I# g6 ]( R* m- s. D+ q- `* d8 g7 z
    // 禁用高精度子模块# H( H  k4 J5 f$ t/ J
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ u9 l! K$ D# z% g' @4 @4 J- h3 }0 X; f+ c
    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 U( Z' F" J$ w% d; @$ J3 R, @}
( _, s: _# {! X% s6 w3 D& s. |' y+ f* J& C' M
void ChopperWaveform(void)0 ?1 a8 o. E* R- N+ ]8 Q5 a
{
' D6 E! h0 q1 t) E7 f$ E- @    // 50% 占空比, q2 k9 z& h( L$ z
    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);# z) S+ p- p' `6 s, ^4 Q
    // 4 分频+ r% H" R* }9 C2 x
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
8 L, }; ~. O3 m* K  T- s    // 单个脉冲宽度
% U* I9 i  V2 J$ D$ d) U/ n3 a    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 J. \; O) s  C6 u3 L; \, y    // 使能斩波子模块
  C4 h, z$ D* [" R! n    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
$ v. o" k0 E; q% p}4 {7 x2 G% j: G8 c; p% R) ^. c

: l0 o) N2 Y  i8 b4 |; e: |8 W8 H/****************************************************************************/
# ]$ ?; W. [; m: q9 H/*                                                                          */
- ^. S3 [4 c4 _+ s/*              PWM 中断初始化                                              */) x+ p* E' R' y9 p
/*                                                                          */& j; n; n: o8 y7 R- [5 ~6 i( n$ z
/****************************************************************************/% v/ z, b  i1 p5 i  [6 d$ ~
void PWMInterruptInit(void)3 C& K" `" M3 F; `7 w
{( M/ x2 [# [; t& X& g* f
        // 注册中断服务函数
& E# a5 v/ D6 r: A        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
5 q9 f8 v! c' ~8 L6 m        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);* G" \5 W7 f. }1 J5 m

# m7 z4 T6 T3 R        // 映射中断4 [2 R+ t" K3 V# D& l
        IntChannelSet(SYS_INT_EHRPWM1, 2);3 ?. W: B. M; W1 o0 B: {# K. ~
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
( A' X4 L0 \8 i1 j  {# S7 J9 x: C0 Y9 p% P. \+ q
        // 使能中断
" ^' ^5 t; ]9 Z+ z" z. V, r0 T% |. G6 l        IntSystemEnable(SYS_INT_EHRPWM1);  D& ^# Q# H+ K; |, \6 v: g
        IntSystemEnable(SYS_INT_EHRPWM1TZ);
. t+ p  f- M/ }, E}
7 @6 C( E' P; c$ B
! F2 h* w7 m( c9 d- N/****************************************************************************/+ V2 O9 u  `+ R4 u$ m; W
/*                                                                          */  R# k2 G, U4 G1 _
/*              ARM 中断初始化                                              */
" s  P& b2 t) r. Z/*                                                                          */
/ Q5 m1 m0 j7 r  [1 L1 j( g/ x; X; q/ @/****************************************************************************/$ f0 A' \$ L: B4 h" K
void InterruptInit(void)
3 q% J6 U: O2 u- t" C{$ G/ p- ^7 J9 S( c! {8 ]+ ^- K
        // 初始化 ARM 中断控制器
: H$ P$ t" ]: M' z: n        IntAINTCInit();
+ d/ P9 b2 h" M: A* p/ D' o! f9 g( x! X& r* J& `% \
        // 使能 IRQ(CPSR)
8 P1 W$ r7 f( B( }5 c' b! a: r$ B9 {* K        IntMasterIRQEnable();" k9 _: `2 ]+ {5 \
! o  j% v' ~' |! R5 v4 `
        // 使能中断(AINTC GER)9 q  g: L8 H$ e8 e
        IntGlobalEnable();4 _( Y7 c% L7 Q9 o( v

# f  ]4 P6 [! B1 t# m        // 使能中断(AINTC HIER)) P5 @" p# [9 V' _
        IntIRQEnable();
+ D7 L" t) r, {6 X/ h}" @: w: O/ m5 k# ?  q

+ y  V6 `3 _( z4 I) r* T
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/
7 Y6 H$ R7 T8 \9 {9 D- n/*                                                                          */9 G9 _) Z$ p; C+ ~! C
/*              中断服务函数                                                */, m( _# v5 ?$ ~: v0 @
/*                                                                          */
6 H. w. T# ~, z7 N$ ^5 N2 p( y/****************************************************************************/
% |  U2 Q8 N4 tvoid PWMEventIsr(void)
  Z' d. F7 A& O. Z9 A2 ~{
6 U5 r. @. x( L& l0 {$ D: b, V        IntSystemStatusClear(SYS_INT_EHRPWM1);8 C. `& b& O: @2 t
$ a" r+ `  w1 [# E. U8 ?
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);. ?3 u# l5 I) }2 @& G3 o
}8 z# d1 Y4 ?! N0 r$ B5 l

  B) l" l4 `0 [! _! x5 w6 Gvoid PWMTZIsr(void)
: ~0 i0 D3 e  D6 w. X  a8 _, `{9 p3 n" X! o4 [+ M: S# e
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
& r3 D$ L8 Z' A/ r0 |9 X8 k6 v7 x, |8 n: }# S
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);) W. m; V* w% K. X& [
}4 ^8 ^8 R% m1 U5 w7 c5 q! U. j

: Z. s1 C4 i; K$ d/ v& H' t% v/****************************************************************************/
1 I* m9 I2 J! M9 B+ P" C/*                                                                          */
7 R+ v+ H( f4 ]& q" v7 w3 ^/*              初始化捕获模块                                              */
; {9 A& t0 f4 d. f4 Y% D0 g/*                                                                          */7 ~) ]' S" W! i$ N8 @" g" C6 l$ \
/****************************************************************************/* y3 ^9 E) o* i/ F
void ECAPInit(void)
0 [4 F) S: [5 C' X& C{& i2 T! Y) m8 Z- t# z8 l
        /*-----设置 ECCTL1-----*/# @* r$ i8 x: r' S) k5 M( H3 `4 [  }
        // 使能CAP寄存器装载9 |: C3 o2 F3 U1 v5 U% n
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
. ^7 Z$ ]: M9 E$ S3 s        // 设置预分频值.
2 Y9 W. q' ?. u% z6 m9 A+ Q, p        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);% P. Q1 L- A; w
        // 上升沿触发捕获事件
0 y1 c& c$ N2 u        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
5 M) p4 W; F6 e2 L        // 输入捕获后重新装载计数器值.
. v1 ]6 P+ }8 b: y5 ~" r        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
: T  g; z! o2 @0 W" L/ r8 g' ^& ~1 k3 ^: S
        /*-----设置 ECCTL2-----*/
  I4 C( {3 x% v1 W( m) U; `: e        // 连续模式
3 _0 I2 w6 Y) A        ECAPContinousModeConfig(SOC_ECAP_2_REGS);, `! x  K. q8 i. E. e4 R/ `! i
        // ECAP计数器TSCTR持续计数
" W# I( M" v$ _* p; y8 c        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);7 U. w: x9 _" x: T$ j, @
        // 禁用同步输出和同步输入
- Z2 f& J6 U% M' o        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);9 t8 f* t) S8 M; N& N/ Q( W
        // 配置 ECAP 2 为 CAPTURE 模式% S! l0 m3 b' y; i# j' Z
        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);, |2 g9 G7 z2 J3 X3 E5 P

6 P7 ~* H+ R: ^) k9 n! h$ A        // 使能中断1 k2 I1 O- H; y2 i3 r1 J
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 R; I, [, W6 g) o9 e% Z}+ Y# T( s. I7 l' ~
6 L0 [3 G7 Z. V' ?9 P( E
/****************************************************************************/  O- _. y8 E" M7 l6 i( _3 O- o
/*                                                                          */) f$ _0 t' Q& z0 J$ |, A4 a
/*              取得捕获结果                                                */" K) L8 p9 q  Y! m' P( M" L( F
/*                                                                          */
4 i3 x& m( l, `) A9 z5 _1 F/ C. j/****************************************************************************/
- e! D7 f, z4 V9 Y! ?unsigned int ECAPRead(void)
) [9 ?- S3 `$ r$ r' y{4 R6 u: H3 F/ M( a0 W8 N. z3 m, |
        unsigned int capvalue;1 ?4 O9 Y. u6 s/ _
        unsigned long frequency;
* _( J6 O- c+ }% K0 v4 y% K- q" @6 O6 o' k0 C0 @: d
        // Event1 中断标志, P* y) d; {1 W) w
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))# ?5 _9 Y& B7 }: c
        {! U7 \; W# ?! w& Z2 G6 s
                // 取得捕获计数
/ |2 H8 D& Z* o3 J- c, x0 s                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
7 e" Y# s) R. h+ O                capvalue = ECAPResult.cap1;6 @4 S: O5 y2 E

- y: H+ i$ Q7 z/ N# I7 m3 i' a                // CAPTRUE 模块 228M 时钟主频5 |7 n& a8 C, `
                frequency  =  228000000/capvalue;; G3 w* K2 y# d& n
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
: n) W/ f/ W1 S1 _7 u& [  s, S9 e0 T9 \8 \6 ]- e2 d- g
                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
* j4 u& O+ f* B! u" r//                IntEventClear(SYS_INT_ECAP2);
, W) y$ O- w/ i        }6 u- f( o* \* J
        return frequency;% X- ~& ~* P0 ]
}
4 @1 I7 a6 |" p) H0 Z
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
& u2 P0 D/ [9 Q# W1 C0 S  J[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