嵌入式开发者社区

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

作者: 浙江第一帅    时间: 2018-10-30 16:46
标题: 请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家/ [/ n. Y, P* k/ A

作者: 浙江第一帅    时间: 2018-10-30 17:00
/****************************************************************************/; y- h( T0 o2 {9 }6 L8 ^, n
/*                                                                          */5 j% x* z# U, P6 o: R
/*              宏定义                                                      */
. g8 x6 D8 x/ n+ z2 [* [1 H( h3 @/*                                                                          */
5 O; B# u6 R2 l" Q' s/****************************************************************************/
' ^( M3 l0 z& m7 p- ~// 软件断点5 W" S6 A5 {. V& Z" M
#define SW_BREAKPOINT     asm(" SWBP 0 ");
3 K$ N( v  |' v4 b3 K+ I' t
# s7 y0 _  a. y+ [0 h& F% u// 时钟分频
0 r& m* o* H2 W! }- b; H#define CLOCK_DIV_VAL     228
  ?  X; q' P% \+ k
  \) F! x" l$ e# K/****************************************************************************/
2 j* w/ j/ d' o- o1 {/*                                                                          */$ G/ r+ K" L2 S) Q7 S/ w
/*              全局变量                                                    */
: g: A" F. x& v+ r( {5 }, g/*                                                                          *// P8 M2 q- b6 s, f
/****************************************************************************/
8 v" \( z1 h5 s8 m  AECAPCONTEXT ECAPResult;, b9 n% t0 d5 m& L' {
$ |( ]+ \0 Z7 q) X' ?" _* e
/****************************************************************************/
! c% y( t- i8 o' r6 [4 \/*                                                                          */
. E8 y0 N/ t8 U( ?5 e& f8 j/*              函数声明                                                    */; ]1 h9 C; E, E3 O; Q5 o
/*                                                                          */6 w, P% f+ c9 ?$ w9 j
/****************************************************************************/
9 g- `5 E; O! d! {/ m% _8 a' P// 外设使能配置- g4 ~$ ?6 R9 j, |& G5 D% E) R
void PSCInit(void);  g1 V+ _, @8 q" X

. Z2 R- `* J& L+ g// GPIO 管脚复用配置
7 ^8 I* @% g6 ?8 S7 ^4 Vvoid GPIOBankPinMuxSet();
) z5 T* G1 b: K5 v& F: o* S3 }. M) _- f2 y8 X% w) I) r/ L
// 产生波形
9 l  _, A& u2 K- q9 Z/ J* \: Q" _& ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# `/ D6 A, u3 x; O8 t* _' Gvoid ChopperWaveform(void);0 I" [( D3 N  X9 {
5 h, z# t. A. L: d2 E( y  \, u
// ECAP初始化和读函数4 U$ {  Y6 a+ j6 }
void ECAPInit(void);
4 q  u. `6 j& W/ k3 Q8 j- U- ?. Aunsigned int ECAPRead(void);  Q; X2 n8 N+ B0 N

: F+ v; Y$ ?( [+ o//ARM 中断初始化7 ?0 Z6 M$ G$ Y: s# g
void InterruptInit(void);! o: f, H  o; ~. i

0 W+ |& q3 ~" r// PWM 中断初始化
, g. Y. u8 F% W- w/ Evoid PWMInterruptInit(void);
/ ]/ R; [' ?' ^# ?5 ?' S// 中断服务函数
9 m* q. K3 h0 p  u2 {# D! h4 d// PWM 事件
0 x  J0 R! n2 Z- Pvoid PWMEventIsr(void);, H# J& V! A4 A, v0 e# ?2 q
// PWM 错误控制事件
/ _. e2 T* }: z! E  r% kvoid PWMTZIsr(void);% n1 {3 E0 e; d# n* z, ]
2 Y/ i/ M6 w8 A" T/ R2 O0 C
/****************************************************************************/" k. ?0 k7 r0 b) D' F4 S) K: [
/*                                                                          */7 i: q) k) ]( p- s; B
/*              主函数                                                      *// I. r% l# V. M1 h
/*                                                                          */1 I/ H& O) D, D8 W1 J, b
/****************************************************************************/
' S: D( ?0 g4 _! Y" h$ Wint main(void)1 G& v8 B5 H( o" d. j
{
8 K0 u* I1 g/ o% t# I: V3 w        // 外设使能配置
( P$ L. x2 S. W' R: K        PSCInit();
" Y+ V0 V" L" b. O" n* n5 g; Z" z
) ~/ v. f6 R0 y* n  D0 I8 ^        // 初始化串口终端 使用串口22 o9 w' {0 D4 J0 k, `7 A
        UARTStdioInit();7 f( E. Q' X% z+ ?" @; X
        1 R$ U$ S! E1 y( ]( P9 e( X  t
        // GPIO 管脚复用配置
; s( t; x; u" I1 A% W) Z% l1 j        GPIOBankPinMuxSet();  G) n* g7 n" e( w2 n! H
$ T. l9 M; t( o2 u- X* ^4 X% M
        // ARM 中断初始化, t* m2 C; n, ?# y
        InterruptInit();$ B/ i" x- P7 C2 T) O6 w. L3 `

+ y0 m. \. K: z* M2 d) e* [        // PWM 中断初始化
$ o) ?, h9 U" o6 G, m        PWMInterruptInit();: n  L: K7 G/ a" U2 `1 h- P, I

5 Q0 n0 u2 m) ?        unsigned char i;- c) i. P* Z: F% L4 c. ]! l$ h
        unsigned int j;. U% {/ B. W5 U9 n) A/ u- X' r
  H' r" S# x7 J% {& E+ A
        UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
1 D8 K/ D- ^. O, Y- {        UARTPuts("------------------------------------------------------------\r\n", -1);3 N+ f( Y: K' b$ y# L
        UARTPuts("                    C6748 PWM Test\r\n\r\n", -1);2 ~8 r+ m  q6 V8 Z" N% A% S( @8 ^
        // 产生波形
4 X- m/ y" z' j, k3 Q        PWM1ABasic(25000,50);
+ O% f! v7 K+ _3 d% C2 j/ H; X% z) ?5 Q6 |/ g. E
        UARTPuts("                    C6748 PWM Test Over!\r\n",-1);6 c, X5 A/ Q2 N' L& h
        UARTPuts("------------------------------------------------------------\r\n", -1);/ ^4 g1 v, m0 n/ ~) a8 T) V3 L
2 ^4 N8 N( i; o3 u

, ?* X+ }& M+ l
# m! t( V; o; z) Q. M, r+ R0 t        UARTPuts("------------------------------------------------------------\r\n", -1);
& Y& ^+ x/ u( X# ]* O5 f: C        UARTPuts("                    C6748 ECAP Test\r\n", -1);6 ?$ ^( p3 r& V% |4 Z. o
        // ECAP 捕获初始化
1 _" y2 ~2 M0 k  R* f' G        ECAPInit();
6 [( M" [# D7 s, e        UARTPuts("Initialize ECAP.......\r\n",-1);- z7 }2 O5 s+ Y
        for(i=0;i<5;i++); P- w) B  f6 O4 `! z: \6 |
        {
8 X% y0 `4 u3 p                    for(j=0x00FFFFFF;j>0;j--);            // 延时
1 s) x. s' x8 V! A                    ECAPRead();
1 ?& P, l$ U% n) M3 l7 W        }2 b! j7 M5 [1 }6 o* {( Y7 S
        UARTPuts("\r\n",-1);+ E- u7 k( Z- K$ g& b
        UARTPuts("                    C6748 ECAP Test Over!\r\n",-1);* G; c: j2 `2 x
        UARTPuts("------------------------------------------------------------\r\n", -1);$ z: s, B9 p2 v2 S/ N

6 h( c) T' c* Z6 i        // 主循环7 w" z; g) v- ~8 b$ r6 v! C
        for(;;), k7 T6 [  t3 C6 H
        {% h4 q% F" F, n1 L- R

# [1 G0 k+ `3 X2 B: O        }7 [, \& ~& s2 A: Y( Z1 W' ]
}5 x# q0 a$ t( `$ N5 t
( a0 z& }. R) p
/****************************************************************************/
8 j* P' a  a* h, `+ X3 x/*                                                                          */2 s7 g/ f( H/ o- ^( }" o+ l$ U7 L
/*              PSC 初始化                                                  */
/ {" [. y7 d, v4 w& R4 X1 i' l/*                                                                          */  v" h: P/ Y: J1 q
/****************************************************************************/; f$ Q/ u& g' U" T# ]  }: D; X+ s6 g4 d
void PSCInit(void)3 g7 n8 q, o) T- Q2 m
{
( \8 x7 x- t2 \+ X% s        // 使能  EHRPWM 和 ECAP 模块( c" `* s) K, r# U0 ^3 ~) y# G
        // 对相应外设模块的使能也可以在 BootLoader 中完成
8 V* O' C: y& r    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);7 s7 X! ?! {0 b8 {& n: P6 ]
    PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);5 J6 o% K5 V" u7 B; J) {
}3 x( \+ P! F6 U- g  D2 X
/ q  R2 O- {8 L! Y0 o: U! a: h7 m
/****************************************************************************/
; |* c: Y! E4 I0 G+ S- {- E& e! ^/*                                                                          */
9 E; I, S" ]5 ?6 ~! o2 m/*              GPIO 管脚复用配置                                           */8 F0 E4 O$ T3 u" g# j
/*                                                                          */
  j, S( V7 m2 q+ y& P. D2 M3 R6 @/****************************************************************************// `) U( l9 v9 T4 k
void GPIOBankPinMuxSet(void)
) Z( T$ L7 Y" S  _{$ l; c7 ~  ^* d& l5 W! N8 w8 B" |
        EHRPWM1PinMuxSetup();
0 l7 W3 v% i) m7 b/ n/ p, @8 y
( {/ O  A) \, B8 M6 [3 ~: W6 L        // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
# E+ G3 b! B( w  w3 Z        // 作为捕获功能时管脚方向为输入
- B3 ]# H3 M  ~) u5 z: o        // 作为辅助脉宽调制时管脚方向为输出. h! G! O# m: @: z5 w- I1 S
    // ECAP2 / APWM2' `7 B. C+ {' @$ T1 G3 M. U) e
        ECAPPinMuxSetup(2);7 l' X% k  Q* j7 ^- \: T7 r7 m
5 R8 A  w% F9 u/ R: @2 k3 C0 e
        // ECAP2 / APWM2方向设置为输入
( f8 {: C# r6 Y" b1 a        GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT);     //  GPIO0[7]
* @1 I7 R) @9 N' O( c/ V}6 }0 L* _9 U& [

, v  ?9 j) [3 c2 C8 k3 c2 i! k/****************************************************************************/& ^2 {( \9 h% {8 C( V) `# [" Z
/*                                                                          */
0 l1 `0 p  W: P/ X/*              PWM 输出波形                                                */
' ~5 g& X" I1 S+ o/ z/*                                                                          */0 R4 P1 V6 u$ R6 }' X  B
/****************************************************************************/* B* l7 y( Y/ g. }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)/ w; \; P. T. w6 Z+ K0 D
{
* @( ?' ~0 }) W" J( I, O1 c! B    // 时间基准配置9 S# W  O4 y0 s  M3 f7 `
    // 时钟配置
" D) f+ `# e: }3 `5 p3 X  N    EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);; U( S" ^# B+ u: g# I; ~+ D2 D
+ h4 \" Y/ N" v* I0 ?3 O
    // 配置周期
% E2 k8 W, F( Y9 d    EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,0 U) b0 i3 o3 {& D3 U, E
                    pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);/ s( a6 ^" C2 q) C2 K

0 k) O; H5 Q5 n3 W' u$ b  O    // 禁用输入同步信号
" Z7 y0 O2 s6 M* W( v1 y4 y5 Z# }    EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; g$ [+ ^- A2 e9 Z0 a
" A- B+ v0 G8 p. K) Z/ s  d
    // 禁用输出同步信号
1 N& V$ R% I# z5 \) R8 d" t# l    EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
- I/ b" @. m$ q4 y+ N+ i0 O" J
- x% x! U4 n, f' q    // 仿真(DEBUG)模式行为配置- I, i* R$ E. g5 V
    EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
* p. ?$ m3 M0 l7 \" q# d& g7 z
9 W+ F- {( @1 p9 ?* G    // 配置计数比较器子模块; P2 l, b" y+ g. o
    // 加载比较器 A 值) n* ~8 O1 `9 a6 W7 s& b7 }0 z
    EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
* ?# Q" D4 N' v( ~' x                   EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
9 R  F) }5 Z( Q
/ v+ z- V. `- @3 j- Q+ g& H; `    // 加载比较器 B 值
9 l+ y# E8 o4 N! N3 \/ Q    EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,1 C* M2 O4 x1 @9 L
                   EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);; ]: g3 J6 N! s- u% ~/ \
( j; _6 i2 C& W6 f. h  J" K; m8 r2 d
    // 功能限定配置(输出引脚触发方式设定)
9 O" r) T5 S( }    // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
" W3 @5 I' L# j3 a2 G2 p% a5 o    EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,( Y1 q# {/ y! r7 |
                EHRPWM_AQCTLA_CAU_EPWMXATOGGLE,  EHRPWM_AQCTLA_CAD_DONOTHING,  EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
/ k8 ^0 n, Y4 w$ G  J6 _3 X# X                EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
/ U$ s2 N/ p3 H) y! y* _; X7 k7 U$ k& B# _/ j' @( F/ K3 B
    // 禁用(旁路,信号直接输出到斩波子模块)死区模块7 t$ a; @1 U9 V0 o/ ~
    EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);0 P3 Z. q7 H$ f

6 i% t' Z/ n: |" s9 ]    // 禁用斩波子模块
+ y  r  M  R( s- N" P6 `    EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);9 [" p4 a8 I6 a  Z

7 w& t3 _4 y( V1 n    // 禁用错误控制事件) H) H- H7 v% ~# A/ {
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);! ~& x3 g  A+ `
    EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
! C- ~: U# H5 X8 `7 @, M+ A) s1 g7 T2 u, W: }0 h
    // 事件触发配置# N' Q3 |) O% c1 O2 n
    // 每三次事件发生产生中断( R- d9 f. H( E$ ~5 V
    EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);( g6 g5 Y' Z3 P3 |6 d; K$ u
    // 时间基准计数等于有效计数比较寄存器 B 值 产生事件/ O' e" @+ o" l6 e/ _$ @. W
    EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);) P: k& ^3 v/ L/ k8 T- s6 b/ Y
    // 使能中断
) f# h; t8 ]  h* F6 W    EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);  d6 c3 c& r' w7 E6 J

- I5 b2 t0 I" Y    // 禁用高精度子模块" B( O! j- U2 X9 p5 b
    EHRPWMHRDisable(SOC_EHRPWM_1_REGS);$ d( {: U% h$ A9 W0 m

+ M! D) h  {- Q+ u    UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 c& j" B/ v" f. ]# q6 A* M
}
) I5 d6 Y, n; y. Q, C2 T0 S# X. Q9 D. ?# w# E
void ChopperWaveform(void)
3 D# S1 t% C( z1 R6 T5 j2 g. x{! d$ A. z1 y5 t) Q! L- O# U! M; l
    // 50% 占空比
+ g8 J$ z) }- ?% Q5 p% U1 Y    EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);$ l8 ^6 ?( B" v$ B- r3 c
    // 4 分频/ g$ ]! g2 R4 b& k( W' t5 g; I& f
    EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
4 W: ^: R: m# `% C$ [8 ]( [1 {    // 单个脉冲宽度# T0 E) X8 E  S7 ^$ N* s
    EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
2 H  v6 r& v: \- U3 a    // 使能斩波子模块. X$ M. h$ o2 s4 K) T- R3 V
    EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% h  r) x( Q% M% D8 w}
% u# W8 x) C! f& x
( \+ N) X& t. L8 |1 Y9 t) {* D  V( _/****************************************************************************/
" Q- `% @1 h. l0 h/*                                                                          */. Q9 l" t' |2 W7 {0 T* v
/*              PWM 中断初始化                                              */
$ G( A0 `; f: s+ `, F4 I/*                                                                          */
8 [  |  @! v& w/ O/****************************************************************************/
) X3 a8 z- Y( I5 |0 dvoid PWMInterruptInit(void)  c( R$ C7 P4 {
{. d9 N" _$ p* o7 N9 ~
        // 注册中断服务函数
9 _) z  J* \6 R$ P, N3 w! q0 x        IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
* q- }$ T" k, x# @. u2 m5 f# S$ k        IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
  f+ G/ {, @, L0 J0 d, r: D, k' B$ Z7 e
        // 映射中断
( ~! q% p, d2 P, b1 E        IntChannelSet(SYS_INT_EHRPWM1, 2);* {$ I8 v6 {1 c0 Q, q
        IntChannelSet(SYS_INT_EHRPWM1TZ, 3);! {/ c3 a$ [# h

* B; C' U7 T5 T7 V+ F8 ^! P        // 使能中断
& Y5 |3 M1 Y: h9 O6 h- ~        IntSystemEnable(SYS_INT_EHRPWM1);
+ C+ ^* J0 g+ u) |        IntSystemEnable(SYS_INT_EHRPWM1TZ);: F0 S1 p" n1 y2 I2 ]" b
}
6 ^7 L, I, O- O8 Q. a# F; u- d  w: N: R4 n$ T3 k+ L* K$ m' S) c9 n3 ?- A$ {
/****************************************************************************/5 @* `. M5 \* J/ h% ~4 ^
/*                                                                          */
+ D5 j' B& L; _3 W/*              ARM 中断初始化                                              */
- {3 k, ], ~. V& E! l( a/*                                                                          */! q6 }1 `  m! k! }
/****************************************************************************/- [- ?. k3 T7 }: v3 |; V/ I! Y
void InterruptInit(void)
3 g4 r$ v% ^/ M: [1 _" y2 ^1 ~9 H{% z+ V3 _# C" r: ]( Q
        // 初始化 ARM 中断控制器, ^5 x) Q$ ~+ p* g$ i, @) j+ o
        IntAINTCInit();
* {7 P5 r9 _+ v) u, i1 `$ c1 w& _
( G& Q: y( [1 h) O        // 使能 IRQ(CPSR)% \3 j, Q- {/ ^$ j# l. K8 J% f7 j7 e
        IntMasterIRQEnable();3 g9 n* P& f( I: T- E6 L
1 ~2 [8 {' H& _
        // 使能中断(AINTC GER)
4 Y, Y" ~0 h% h8 v- u        IntGlobalEnable();) ?' @) t$ o7 I) Q

+ m. ]4 y, E4 F" a9 C2 i        // 使能中断(AINTC HIER)& w# T) F+ e3 K  G0 E  v; M
        IntIRQEnable();3 ]; j0 |! M$ A: V
}8 H# C" D" L% [1 C: |/ M7 ]0 @

" Z4 a+ ]/ _( y3 o0 q, N' T
作者: 浙江第一帅    时间: 2018-10-30 17:03
/****************************************************************************/" i# R9 E6 H/ n
/*                                                                          */, ?+ P) b0 t$ f0 e8 M
/*              中断服务函数                                                */$ o8 R9 g3 X$ ^! L9 y3 L% f/ y
/*                                                                          */" v/ e4 u9 p# k) a; z2 ^: u9 q
/****************************************************************************/  ~" z# ~1 j9 C5 P
void PWMEventIsr(void)6 G$ e& _+ q; t
{
* R6 n0 e6 c& t& ?  m% _        IntSystemStatusClear(SYS_INT_EHRPWM1);2 y* q; K0 ~* O7 L& b
3 a3 A% r5 R5 F- z
    EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
5 ~0 C9 r6 \0 X& X6 b" u}# r. N! y) j- w8 F) t* C
* e) n( {# h. `+ V( \
void PWMTZIsr(void)* y. n/ Z& {; p- K7 o( O
{, H: a3 ?: R* y; j, V, \0 w
        IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
2 ]: Q% H7 l9 O8 R& T7 {2 }5 J7 K$ y  i4 T( t# @0 P" p) v( v# O
    EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
1 {# U9 `# A4 T' k& ^}8 Y. ]4 }6 a& B" S  F& r

( l2 u2 C/ L3 t5 M. }. F- n/****************************************************************************/
- h. C3 C  f: r/ z: F/*                                                                          */9 j& C% Q9 _5 N
/*              初始化捕获模块                                              */- ?( K4 v' |* h* V- [3 O
/*                                                                          */+ m! C7 @) S2 m: X) h1 n* F( r1 f
/****************************************************************************/
* M5 C1 V9 T$ g9 y$ Evoid ECAPInit(void)* t3 E- D) [; V* O9 l# o8 V
{8 e' K* y- P) o8 U. U* ^. `
        /*-----设置 ECCTL1-----*/+ F$ q7 ^; r8 Q; p0 u
        // 使能CAP寄存器装载) F4 r% s9 y1 v& a9 R/ g4 u: o
        ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);4 d) s* e2 X  d* B" d% Q
        // 设置预分频值.
0 J2 S8 X% T& C& s2 Y        ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
: Y4 L% W6 Q8 F3 f" c$ u& S        // 上升沿触发捕获事件
2 S+ m: p  f3 c9 ]: A  v: {        ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
0 Y3 P6 k% y0 S. z        // 输入捕获后重新装载计数器值.* U9 S, ]! `) z) H$ y
        ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
6 I; u4 q5 t0 y9 D9 g, C: s. A; @; d/ e% B* s
        /*-----设置 ECCTL2-----*/
/ S- b/ w9 E" u3 F9 q; {, e2 q        // 连续模式! Z. C8 i" b9 }* W2 Y1 F8 M
        ECAPContinousModeConfig(SOC_ECAP_2_REGS);
7 V  R' o" Z( f  }: t2 ?! T+ z  a        // ECAP计数器TSCTR持续计数
& y% Q' @) Q2 u( M9 h, Z        ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);  i. I4 X+ d: [1 r
        // 禁用同步输出和同步输入. r- F4 Q( l% F2 o
        ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);; C" f2 D" E8 `1 s8 u% R
        // 配置 ECAP 2 为 CAPTURE 模式
0 j3 `/ ?% ]4 h( _        ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);4 l( N, x5 [/ j5 _' A7 p" i

8 l& S0 Z* Y- Q7 e" a# w: f        // 使能中断  u. {( Q6 L! u( k. x9 P
//        ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
5 D+ o/ K* c' r7 z, s! Q4 o}; Q# U; ]4 V- s5 x. H

% \, v" Z; ]3 z, B4 v: l2 x/****************************************************************************/$ y. {. F, K) l3 ]/ ~1 p2 U
/*                                                                          */: f) F; R6 o! a# ~
/*              取得捕获结果                                                */& X; _' j( D7 U0 ^, G
/*                                                                          */+ f* j% R/ y1 x% j3 f; Q0 ^+ l
/****************************************************************************/) X! M4 ]  y7 l3 R- ~; N/ t
unsigned int ECAPRead(void)' J1 n0 P1 V3 K. ~, m2 ^
{, s" n5 j  |* f% b3 Z4 Q' G
        unsigned int capvalue;( _. n5 X* N( P% k9 M- t/ ?% {
        unsigned long frequency;. b# R) ?: q4 r. \, u6 N+ j8 [3 p

2 s. n! n# B6 t: F/ y        // Event1 中断标志  t- Y6 A2 r) D, B  G0 P" l% g) u
        if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
( U* c4 K4 K% j# Y* L4 T        {
. j" Q" Z% S5 Q' E( Y$ j                // 取得捕获计数, E" R) M* h1 S! ?" ?0 }! u# E
                EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
$ H0 M  l5 A* K" u# q                capvalue = ECAPResult.cap1;& N6 V( I0 U% c- b) o) Y
; [  `; S& }  T, _$ U: C) v
                // CAPTRUE 模块 228M 时钟主频
( F- I4 y- H* U5 ?! m, F                frequency  =  228000000/capvalue;) T9 R- m( I0 C
                UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
. r5 U9 ~5 k/ k, {' m8 ]
/ n1 k3 B( x0 u# C' ~- O                ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
& M& h5 h, v1 {6 o//                IntEventClear(SYS_INT_ECAP2);
; U' o1 S: }3 v5 z+ O7 f        }, K' f3 P7 [8 C* @7 a6 c( U
        return frequency;
# |  r' Z" _$ F8 ]}
; X+ A' P0 R9 S3 {
作者: 浙江第一帅    时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者: 广州创龙莫工    时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
- r8 u* h/ S* I[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