1 f1 J% B, n \, i& H% D7 b9 N- _/****************************************************************************/$ f) q, D+ x6 P) I$ v
/* */ 6 x/ j( V9 K3 o; g4 g: p/* 函数声明 */: c+ h6 N7 e9 o/ _
/* */$ g6 i) f1 i4 u3 {5 I8 |
/****************************************************************************/ 2 b2 i. L. Q- `) D/ u. s7 Z// 外设使能配置 . E2 \0 X8 s) _9 V+ e( evoid PSCInit(void);* n4 U5 ]- L/ @) ]
: o+ B; s0 C2 y- `' |3 `* ]- Z// GPIO 管脚复用配置, q- q" s/ [# w( v$ z
void GPIOBankPinMuxSet();- \7 a$ a+ H! k7 z9 h
; P m' x5 u, D2 t+ f. `3 \& o
// 产生波形3 N r5 I+ _! L+ f2 O
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);) D" I3 t( i. v- J
void ChopperWaveform(void); : m6 a8 s9 Z4 j7 X& [ ~0 z" [: |+ E X5 a: r1 x3 X1 x
// ECAP初始化和读函数% H# B0 E& z+ S5 y2 l
void ECAPInit(void);2 v. D8 @: f/ }
unsigned int ECAPRead(void); # y, ?( j! ]5 ^( L1 j0 z5 J! ?4 E- V' L( x( ~* x$ {
//ARM 中断初始化 % D$ u: d; Q3 t7 ^) w$ W9 [void InterruptInit(void);% j) B: \2 p- g; E1 x- w
0 G$ l) I" k8 C
// PWM 中断初始化' \8 i; X' C) [+ a
void PWMInterruptInit(void);1 f; a$ ]; ^9 \+ O* H! H
// 中断服务函数 ' f! P3 `5 H/ _0 j6 _. ]// PWM 事件) Z5 t W% N, w" B) l4 J
void PWMEventIsr(void); * G0 [- p* P# C// PWM 错误控制事件 $ F6 H6 T$ l9 u" M& H, Q% yvoid PWMTZIsr(void);& ~6 A; f m* Y: F" V8 S9 l1 E2 |: x
l4 `, j* l1 l3 D9 S# F/****************************************************************************/2 k! O6 [! S; q# Y. v g H6 Z7 p
/* */" j6 T5 T9 j6 t7 C& B5 o3 e
/* 主函数 */ 7 }6 ]+ x. X" T% x7 Z/* */ % p8 {+ Y/ J9 v2 n3 [/****************************************************************************/1 w( J/ M: a$ b8 \0 X0 D
int main(void) * z& x. p1 {7 H/ E- ~* V% C5 @{4 ]; m1 ?) E* q4 i0 C% R' S$ ]
// 外设使能配置. \9 F/ L* y: X4 ], L6 d6 `0 s
PSCInit(); . x O! c) {/ f$ v; ?- u2 } , @+ n- X+ m8 w+ Z" s& E7 X // 初始化串口终端 使用串口20 g, n8 D( d2 {4 c: x
UARTStdioInit();0 y# S. N, g. B3 K
4 a9 X" L+ g+ Z+ c" Q; @$ k // GPIO 管脚复用配置 - F+ d! S! \; M3 v. e+ _ GPIOBankPinMuxSet(); $ [3 t. l( m+ n* i& F% k1 s) e0 W+ P4 E6 C! m/ t M' c* U/ F
// ARM 中断初始化1 X/ h) _& n( ^5 X9 e
InterruptInit();6 X. B0 {- m# O+ s/ t5 N E z1 o- b
- M" K9 n6 J/ p; B) u* Y
// PWM 中断初始化 / Z/ t$ E% z7 q; } PWMInterruptInit();# w' W: a+ l! d( L% \
9 b% z+ b& N- j7 r$ e% a2 o# j9 G unsigned char i; $ O8 U: x9 M( Q( {4 Z$ ?2 I- L' ^+ A% T; O unsigned int j; / \- u6 Z7 ?7 _: o6 ?- M) |9 M4 x: L$ Y# n1 X* }# O5 B
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1); / g" B3 P+ C7 ?- a% c UARTPuts("------------------------------------------------------------\r\n", -1);0 `% R, N T* O2 N
UARTPuts(" C6748 PWM Test\r\n\r\n", -1); 3 q [( L2 d- c# i" N0 F! }, c // 产生波形 . m) F# R4 B( l6 L+ @8 g1 I PWM1ABasic(25000,50);3 ]0 \( ?& O+ H1 Q" s$ B% P# Q2 ?
1 }4 W& v& Y. P2 X) O' t UARTPuts(" C6748 PWM Test Over!\r\n",-1);1 k% G# f' a: ]) ^3 N, G7 r
UARTPuts("------------------------------------------------------------\r\n", -1);& z% U* p6 P- g2 K4 h
+ J0 ^% S3 W' y5 G& _1 s L! J, x: c0 N# h3 u, n
7 E1 p5 E$ M8 O$ \" { UARTPuts("------------------------------------------------------------\r\n", -1); % m8 d, } S, h9 U$ v UARTPuts(" C6748 ECAP Test\r\n", -1); 7 N5 L; m3 H! p# M // ECAP 捕获初始化* G2 _0 o) c }7 [7 X: g4 J
ECAPInit(); 2 @; H$ S/ W4 K# I' ^5 V$ S UARTPuts("Initialize ECAP.......\r\n",-1);2 _0 Q4 y7 T/ Q# p
for(i=0;i<5;i++)- d7 n2 Z$ f, Y, x; e/ w* j# g- i
{ 5 e, {, M3 e4 M for(j=0x00FFFFFF;j>0;j--); // 延时# ?4 `: y( S9 Z0 A2 Z6 C' E0 V, b- @
ECAPRead();+ w- C1 D" c9 k) x
}; ]2 c6 ?& T0 T$ }4 Z% @8 T1 m
UARTPuts("\r\n",-1);6 K/ \; h9 ^$ l
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);! }' L: l$ B4 |1 q, A# L
UARTPuts("------------------------------------------------------------\r\n", -1);4 c* t4 Q. t5 s4 j ^9 k2 ]
% H2 E% _& }, L. h; h. Z% S // 主循环 9 y h$ Y+ x1 Y& M- E9 U for(;;)6 k0 y2 ]% D9 }$ }! |
{ 3 a/ y4 D/ h; [4 O0 @9 v) R: P/ T - ^+ p ~2 Y/ \7 ` }( B& b! z6 }$ X- `2 Q2 Z
} 5 O! d" p; Q5 F6 H* s: V2 o& d- Y V& b. O/ w& ?
/****************************************************************************/. Z# y0 A, x- h5 V* M$ i
/* */ / Z+ ^8 d. v' X9 O# L/* PSC 初始化 */ $ R6 Z) x) d5 p0 Y+ @+ w6 o/* */ % H$ u$ [# _( Y+ ~5 p& _! n/****************************************************************************/ 4 {5 H4 g& K( V/ A6 @# `void PSCInit(void)3 k% \+ P0 t* e4 q" N, v
{ / @3 l. r3 t* b" K // 使能 EHRPWM 和 ECAP 模块7 t9 A' s k5 B( s$ d3 D8 t
// 对相应外设模块的使能也可以在 BootLoader 中完成 # E; r/ U) U( a1 H/ b" Z) Q PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 w. f; e2 M- y7 s S4 L5 N) ~" Z
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* ~7 r* L3 k r+ G4 x; l
} 1 B& F2 C/ a9 ?( o+ L% `$ i; M# Q4 K. o/ e# h, F5 K5 J5 o% |
/****************************************************************************/ x# t" j( a% ?/* */* y$ H( ]9 p! [ _
/* GPIO 管脚复用配置 */ $ s5 n# _& J' @+ `/* */ 7 |. A) _& X0 a2 A/ m2 U8 W9 I) M/****************************************************************************/$ z7 n6 B/ ?# W1 I4 b
void GPIOBankPinMuxSet(void) 7 r X2 G6 Z6 }! O{. l }* [& j1 O S v
EHRPWM1PinMuxSetup(); . W( l' l8 f/ i _1 w / H+ {( R' x G4 [) ]( w$ Z/ Z // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)/ W+ n: o, ^) x7 R$ k8 ~
// 作为捕获功能时管脚方向为输入 + t' z% L9 i" P" R, ^9 e // 作为辅助脉宽调制时管脚方向为输出. E$ O- M" M6 A& {$ p' e
// ECAP2 / APWM2& Z! p- L* t. y' M) Z8 M
ECAPPinMuxSetup(2);8 {$ r& J2 M) p3 C- h; Z. o* ^
1 J. Q/ M9 d9 E: T( y // ECAP2 / APWM2方向设置为输入2 n4 d- y) `9 S9 p1 U
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]' T9 [# D1 e$ P U! k% S$ Y% ]* q
}8 w2 h8 R$ e& F
# [& ^' A, a( Z6 \/ d/****************************************************************************/% ?5 ~ V I" e6 s* a2 A3 Y( c2 J2 j
/* *// f4 ^/ k0 E$ J. Q6 t
/* PWM 输出波形 */7 P c, N9 ]& `% i
/* */ ) C z& X3 [8 g- l; h# e/****************************************************************************/ . _- V' l2 D- H( c* Bvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)+ i0 v7 f% A0 }6 I" R+ o6 Q
{ 1 T6 Z: S/ ?/ N" S( v // 时间基准配置1 S) P o* J; n+ O3 S/ C
// 时钟配置, B7 e* E' T- S1 I4 e! B: Z- P- J
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);3 w/ P! }$ b, {3 K: L
8 Z# b4 [; ~; }7 `
// 配置周期3 H5 w+ ?% g8 |2 |$ O
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,3 s6 S# X$ C1 ^5 x9 l1 G' t
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);8 L6 y, F$ r; X* {
( n/ f. e6 W5 ?4 h) l8 y
// 禁用输入同步信号 6 n0 V9 {0 _2 S$ i9 L( `2 A EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);; o, M- q' w5 b" @6 [
8 U i0 { w- B* Q. R // 禁用输出同步信号/ }% C& V1 \2 Y- V0 u+ M% x
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); $ g- T' o9 _, i. w: j- c$ i |% _3 o4 ]" N# V) N3 q // 仿真(DEBUG)模式行为配置 8 L9 m/ w6 o. V2 \/ c EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT); [/ s+ U2 F( Z( S' z4 D
6 A7 X# l }1 O4 o$ X2 c, E // 配置计数比较器子模块 $ o5 Q* u5 f! |( m+ S // 加载比较器 A 值 $ E0 w4 p/ ?* l6 ~& o: h6 C& j EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE, 2 O( s5 U5 D) { EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); 3 ~/ |7 T9 Y1 h, z4 J/ t # v) p: w: F) B8 z. `4 }: k& E$ l // 加载比较器 B 值( _, Z8 u: p6 |# P$ {# J1 H
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, 5 H1 X) t7 e5 o6 Q EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); ! Z0 X2 i1 t% o ( _2 m' ?2 Z3 J' ?/ z: b" m& ]$ w // 功能限定配置(输出引脚触发方式设定) - i( |& {. R, j9 A U3 D // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 % P- d: x) \5 W EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,0 u* S- k- I, d3 I
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 G/ B7 B. G+ l
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING); # m- a$ m" m D7 p: R 8 `- T* A: r) N5 S1 V, d* F0 S! \ // 禁用(旁路,信号直接输出到斩波子模块)死区模块4 R1 F/ ?3 w. W6 {
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);6 U8 l8 \+ ]1 Y
. o, z3 M$ R. w1 \) z; T* U6 S
// 禁用斩波子模块( i- o n4 L0 i( Z: l
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);6 d: Q1 [, V% I& a$ B9 \& X4 ^8 `
+ M+ p$ W5 ~1 O* u) E, q0 X // 禁用错误控制事件 6 J6 j( G& Q5 g, q" @! F EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);4 p4 a& c) x" E' F+ j
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);/ n$ {# E9 w+ z
. d2 |+ O2 j6 Q // 事件触发配置( S" u% k0 R' F" N4 j8 t; N4 G
// 每三次事件发生产生中断 / H6 [* E, t- }* b, V2 Q: t9 l EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT); 3 D% L$ J5 j& _6 s- u( V // 时间基准计数等于有效计数比较寄存器 B 值 产生事件# d! }8 M; f+ b
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);8 V; C; [+ Z, N) T* \& ~
// 使能中断 * J. g- E2 Z: z6 M9 R EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);& l6 T/ Y% N- J8 [4 }, D, Q