) o- Y+ ~) n$ G, e$ V// 产生波形 ' d0 a. S% I( ?8 Q6 Yvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);( O$ L7 b! P/ H$ q/ u
void ChopperWaveform(void);# h+ P% n0 l" z2 w- d
* `- _# }' M8 Q8 e |$ n
// ECAP初始化和读函数( z$ e! P5 C& g: f3 F
void ECAPInit(void); ! V @9 Q' ~/ a( uunsigned int ECAPRead(void); ; u+ u1 _( }5 \4 R6 H4 e( H6 ^0 R- Q5 ]; x- |
//ARM 中断初始化$ V5 q2 P2 `! ~2 S. Y- j
void InterruptInit(void); % e# w$ ^6 v' f5 E8 }, h9 ~# { 3 |: X1 {+ \ a6 V5 R$ g// PWM 中断初始化% I! Z! p; d6 |8 D; j' `7 a
void PWMInterruptInit(void);( ]4 |6 A* j7 n9 u! Y8 u( l
// 中断服务函数 6 }' |! O9 d4 r" b- @, z- |// PWM 事件1 M, `9 e( O/ v9 L; m
void PWMEventIsr(void);4 i5 N" t; O& `. f
// PWM 错误控制事件' }# R( f n }
void PWMTZIsr(void); $ u% F9 G4 R/ D$ {) e9 @7 [ - }: Z) a7 H/ V. R& k. l/****************************************************************************/3 E, p- `( J/ T
/* */ ' N: P; d4 v: k; E$ ~/* 主函数 */' |4 g! I! b8 K/ \, f
/* */ 7 l" M# K2 S7 @4 ?0 d/****************************************************************************/ n8 ^, M; y: R( S! q0 mint main(void) 6 D- P1 K7 E4 N& N& L! W6 V( w) o{ ! a6 O% S" c" X/ d8 e // 外设使能配置 ' F0 F Y3 g {8 c# Z/ a2 a R PSCInit(); 8 F" u6 m/ ~. s+ _& s! F 9 F9 P0 a7 Y- k% o // 初始化串口终端 使用串口2 n8 D# w: l2 B/ U. P5 d UARTStdioInit();9 ]- p; h6 ~. r
' [3 R- h* {5 b5 D! K
// GPIO 管脚复用配置 - |$ E- p) Y7 V, D# e GPIOBankPinMuxSet();. w. G, ^ e7 F `/ K1 v/ P3 B- b: B
* }& h, p1 S6 ^3 {# ^' v
// ARM 中断初始化 7 {& Y' D" H) L- r* t- l InterruptInit();& b5 F ]. R h# d9 |' W
& J7 Z' R4 ^+ A4 c" X
// PWM 中断初始化 7 y# x, p7 o. ]- t8 a8 s PWMInterruptInit(); : z) [0 U) a( D2 D! a K 6 n8 h, }+ D% g+ ^9 c0 F5 f6 p/ F unsigned char i;1 ]. H1 B N& x8 l9 k
unsigned int j; k- H9 Q m$ g& u
( r9 }* h% A3 v8 v# R, r$ e) _2 m
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);) Z4 a" ~& v$ w1 b
UARTPuts("------------------------------------------------------------\r\n", -1); 1 }; x4 d2 ~/ a7 J; J4 t0 _ UARTPuts(" C6748 PWM Test\r\n\r\n", -1);! B* S/ p. w1 _$ G! F6 v9 b& B& K
// 产生波形; B% t: X. h4 q* l
PWM1ABasic(25000,50);( e) Q% o% F2 W8 O, p' c( p
% |. C, R4 X8 z5 V3 x' g d UARTPuts(" C6748 PWM Test Over!\r\n",-1);% w+ n6 j, M/ A, G. ~ M _; r
UARTPuts("------------------------------------------------------------\r\n", -1); ! l/ n$ _% @1 U3 R" z# L2 @3 E; p5 O! V. d; ~2 B8 k
( C2 R& g. x! v3 A0 y' Z. O& }& \
UARTPuts("------------------------------------------------------------\r\n", -1); 2 W- {0 x4 w, q4 e; a. @9 R' c( g n' y UARTPuts(" C6748 ECAP Test\r\n", -1);, `( @6 N9 |! t+ Q' h$ T5 w: r7 P
// ECAP 捕获初始化4 o! ? O/ G2 z; M! ?& T
ECAPInit();3 y9 r/ u9 E1 Q0 o+ S' c/ a
UARTPuts("Initialize ECAP.......\r\n",-1); 1 ~& \& A# M+ e1 Y U7 A8 g for(i=0;i<5;i++) " U! K" z3 K# Z {7 J) ]/ o& @0 C$ O* }& v: }
for(j=0x00FFFFFF;j>0;j--); // 延时 ! W n$ e+ v. N: `1 N ECAPRead(); 3 {4 P: n' u# |8 R0 Q6 S! r8 ]- { } ( N& N) J0 ~$ w5 I UARTPuts("\r\n",-1); % i. k0 t3 Q8 v0 ` UARTPuts(" C6748 ECAP Test Over!\r\n",-1); 2 `2 F3 t* u- r: S. K0 E UARTPuts("------------------------------------------------------------\r\n", -1); ; B( O. Z6 D( r+ z ; |3 s9 Y- F! g. T1 U" ?9 Y% l // 主循环 / C/ u0 E! @, \( Y8 }- s for(;;) E# o! m4 C0 F+ W3 }0 S
{5 l: i4 m9 I, J; t& y Y! |- p
7 j3 `& _6 C9 V! ?1 m# n } 6 n0 \/ B) i4 U$ M% s9 Z}7 t H5 P/ X; [) }4 D, ?3 B! }
+ F7 ? `7 I6 l+ R! ]$ A/****************************************************************************/ ' \" h+ t) [/ O# c+ y/* */) R' |4 O/ r5 }% D
/* PSC 初始化 *// ?+ |6 C1 n: B, g5 r2 o% O
/* */ ( |" _! U4 h% \2 \/ b5 M/ E/****************************************************************************/; ^" w* p/ E0 Z \! k4 y/ b; S- \
void PSCInit(void) * `. P+ ^& F$ I9 m# r* I. i# w& {{+ j0 I' B. S$ w. ^
// 使能 EHRPWM 和 ECAP 模块 + e- W) `' v9 H" D // 对相应外设模块的使能也可以在 BootLoader 中完成 5 e X! h- @+ I% I3 O" e PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); , Y, i" l. D4 n: A. @* e% S PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); / ~" t9 v% I: B5 q; d1 o+ ^}1 B# t+ y4 T( H8 Y1 T6 _& v6 y
8 e. @( D5 U! n; Z. d; y# f4 E
/****************************************************************************/0 V7 G! y- \1 s
/* */ ! A+ B: Y+ y9 W. V3 u/* GPIO 管脚复用配置 */, r+ ^! ]+ H2 p; m1 i p% H. q
/* */% b, H8 t/ Y- Y2 g9 D" l2 F* r+ W
/****************************************************************************/+ I% S# T2 w( W) E
void GPIOBankPinMuxSet(void) - q) F, m1 z# A) {6 I{, y9 w- O: d- g9 J& f
EHRPWM1PinMuxSetup();+ r& Z" X. a5 Q$ e0 p9 A+ c( F
/ M1 N4 P6 J4 X1 |$ Y+ z4 t // 配置周期, l+ N( U2 F ]! k w
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,; \+ C9 G @: ]) t2 E7 t3 q
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 E# d G& t; D& a; r0 [+ y
I3 m" G% M& X3 z+ D // 禁用输入同步信号 % P! l% f1 Z$ F+ \1 a* [ EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); ; x# e# H. K) w% [( p |; r% D; k* H j0 G9 g
// 禁用输出同步信号 / U" |/ p$ Z6 F3 _8 v- P EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);9 L( Z- W) U4 U3 S0 T5 J6 s- m
) o" |) X+ z4 M; R; s" H& S+ M5 T
// 仿真(DEBUG)模式行为配置 9 O' t) d* c6 c( u- j EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);3 I; c9 \. O) P2 C6 l
3 V) a5 q4 j ]! Y! `3 D! {
// 配置计数比较器子模块 " w: T5 i* H5 X. }' [8 K // 加载比较器 A 值 ) f) k: G3 i2 b6 b EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE, - V, h: A" p. Y- T. q: X EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); % D# Y% ^7 T% Z+ Q$ R( z/ e% M! I9 k6 f1 _. Z+ F4 C
// 加载比较器 B 值4 t: r! K! A% C, |+ l
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, . ~1 f8 T9 C! V) m EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);. K4 f: u6 A6 k0 t
* L. i. h5 ?1 V. c/ l
// 功能限定配置(输出引脚触发方式设定) - D$ Q9 S; b% A! w // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出3 u8 l% z( m& E2 |5 i7 C
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ S# F4 q* w: Y" Z4 A
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,4 f( m7 Y) a9 V1 _6 f! E
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);% O/ d0 e$ @! A( x- `6 q
# y7 O/ E! k+ H V- m3 \: N. O; ?0 y
// 禁用(旁路,信号直接输出到斩波子模块)死区模块 , Q) i% |% n0 X# l EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);, G5 L' G$ g& ~+ F
1 O+ ?6 `, l% J; ~& {. H* X
// 禁用斩波子模块% M) v( Q& ?) [& r7 ^9 {8 ?
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); ' ^, L% f$ I$ M7 T; C 1 G* |1 d5 `4 T( t2 p2 h% l, V // 禁用错误控制事件- q7 ?0 P& v/ b
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT); * ?" w; ?, X6 S7 K7 k EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); 5 Z8 Z- q, E' r$ b b' j, j% z4 U" y C6 I
// 事件触发配置3 Y6 r) t& X: ?
// 每三次事件发生产生中断 2 M' r3 }4 n$ b+ V4 |! O" r, D" C EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT); - e6 @1 @- `6 }7 Q$ J1 ^8 o j* I // 时间基准计数等于有效计数比较寄存器 B 值 产生事件+ ^* Z1 }6 @9 R8 _$ t
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); : p$ m( q7 X1 ^ // 使能中断; N- u8 A% E, t: Y/ L
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS); D2 B1 S1 Y9 K* f