|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
# |" I N0 m' r" G% B4 l2 K0 D; j% |/* */4 H* H/ @( {) i$ ]+ f+ r
/* 宏定义 */2 a) [" S" t, L9 f
/* */
( c! ~ h" p7 ?5 C/ G" d0 r/****************************************************************************/
- G0 Q+ z1 d: b4 f0 Y- q4 K// 软件断点8 _' p4 L; C9 h. Z& R+ k! R
#define SW_BREAKPOINT asm(" SWBP 0 ");
( H: D: c4 k! g7 E2 E, z5 r K: }2 o) ~; v' z' k3 M; a' _5 S
// 时钟分频" S+ x& T! {. N5 |
#define CLOCK_DIV_VAL 228: c% C" n' }6 n4 C5 B" n
+ c/ v* e+ }# [6 t# k
/****************************************************************************/
7 A. W) e' X7 e6 X, J/* */. s1 ~8 d. j) [; X* ?: A
/* 全局变量 */- v' G) E- b* \1 S7 D4 r
/* */
9 v( t4 j% |. {8 w8 m( p/****************************************************************************/3 |- O* m; c* x5 l
ECAPCONTEXT ECAPResult;
0 r% z0 r- |3 y& B1 Q8 e* `) P0 n5 m( }0 w. J/ a" ~
/****************************************************************************/8 `* o" X3 K8 h: x& f& H- ~
/* */" D1 Z4 u' f* n& V% K/ P% |& E
/* 函数声明 */* \4 Y! L1 `' P5 E' w
/* */
3 k% B! M7 S1 b5 k P" C/****************************************************************************/* B6 F0 H- Y" t
// 外设使能配置
+ S* I: ] C2 avoid PSCInit(void);) D7 I7 }6 u* @" e
* V2 q0 Y% c; h0 P6 c1 v. b: v// GPIO 管脚复用配置
: u( _6 E. F A' N" nvoid GPIOBankPinMuxSet();
) ?1 _- @) I6 `% N: r
$ T) p' J9 M9 i1 D8 j( D* A// 产生波形2 x- r+ p ]- e! D4 q8 J6 ^+ @- }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
# {4 M; S+ S+ n! d0 lvoid ChopperWaveform(void);
% Y: W/ Y Z; y1 I- [
6 ^4 Z1 I6 Y: V$ T% L9 i5 I N" k! C// ECAP初始化和读函数7 [( Z' `0 N1 I/ x
void ECAPInit(void);
5 ], d/ q2 ` K# F! `unsigned int ECAPRead(void);, b9 B/ H- {& T) c8 g* s
3 s8 B+ O0 `, l1 x- d//ARM 中断初始化
( ~# n6 r- x {5 z! g1 ~void InterruptInit(void);
# v4 {7 ^( k) s, L( T
0 E5 I9 p- z$ I// PWM 中断初始化
: `' y8 r5 o% N! s6 \9 avoid PWMInterruptInit(void);
# J1 T& b$ M% n* Q# R// 中断服务函数
$ v- K: f3 b! a// PWM 事件
! Z- n8 C# w- X3 jvoid PWMEventIsr(void);
. T, E5 A/ {9 C' b2 r) Z// PWM 错误控制事件
4 x( V% ]/ O8 X# l/ yvoid PWMTZIsr(void);
- l% O) p& g5 T% q( v7 k# \( g) d3 w- z0 e4 ^( V
/****************************************************************************/% Y0 a7 ~$ P8 e( s! }2 V/ G1 I* ~
/* */
# K8 w, y# b3 `* ]/* 主函数 */
- _' ?9 n8 L) g0 C6 Q/* */
! k% e' q3 N+ M; L' ]/****************************************************************************/
2 `5 F; i+ N0 d( eint main(void)
0 T6 X& F+ P5 s$ H0 V% d8 k" f7 g{ w4 F F) t8 S6 C( d
// 外设使能配置
5 n V# m9 h" _9 K( d$ d7 o7 ]) H PSCInit();
/ M/ K) `8 S' q4 d, J+ M8 w1 v. U6 c- z
// 初始化串口终端 使用串口2
! H [3 W% H6 @& f( w/ y7 ` UARTStdioInit();
$ w1 P3 B1 n% v( f' @) K/ g
0 ?6 y$ ~+ d1 x) Q6 O // GPIO 管脚复用配置
) x' W7 @, b" J: j5 w1 @, x GPIOBankPinMuxSet();; Y; \/ B3 J' s* r$ \0 w1 m7 d# `7 L+ O
% v9 C! Z5 f6 Q8 V! t5 T // ARM 中断初始化
4 U- L; ?9 H; V1 t InterruptInit();
% C9 U' @9 k) e1 [& _0 U8 \+ }- B
// PWM 中断初始化
- K& I* Y( M U+ N( H, M PWMInterruptInit();
* }+ E6 ^8 f6 r; s
' V/ d& s3 G# J( ~, |7 I3 F; L; u3 Y unsigned char i;7 W. c5 P) t* u+ @! U
unsigned int j;
; ^( A% m8 @2 J Y6 z. c, H6 B
! B0 H6 S; \. w+ Q: M5 V UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
) \) o; Y) R) [* t3 V UARTPuts("------------------------------------------------------------\r\n", -1);+ Q" A% m5 r' F. J
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
6 H# X+ T8 B g$ `+ a& j // 产生波形1 T# [7 D9 B6 ^/ O
PWM1ABasic(25000,50);6 Y; X' N- g% ]' Z
: `- _9 e T+ p( z
UARTPuts(" C6748 PWM Test Over!\r\n",-1);: e0 v9 p' M4 Y$ b2 L! y! L
UARTPuts("------------------------------------------------------------\r\n", -1);( \8 h8 W; Z& I6 Q
% d6 O, i, |' p" O
2 C7 X. B4 `3 v7 b* n0 i+ S, j( f+ G, S( v2 n' H
UARTPuts("------------------------------------------------------------\r\n", -1);' V1 q4 H2 |" z0 w1 \& I3 X
UARTPuts(" C6748 ECAP Test\r\n", -1);
4 n) }% N* A, ], l; s$ C0 X% Z2 n, Q // ECAP 捕获初始化
, X+ A5 T) f/ Y: y ECAPInit();
- Y" z7 O5 L; j- J; }) I2 y; N UARTPuts("Initialize ECAP.......\r\n",-1);
X- C% @& Y( ?: k for(i=0;i<5;i++)
* ^3 o# Y% @/ V0 k {/ X* m- ]0 U3 C- ]5 L
for(j=0x00FFFFFF;j>0;j--); // 延时
3 B) r" q- e8 S6 z$ g# z0 h ECAPRead();
% e" a/ _% f( h% T }
+ S1 x" D; q+ ]6 p! u* ], U UARTPuts("\r\n",-1);) L2 i+ b2 t& x( U2 g
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
( _9 t. \% h$ V' C UARTPuts("------------------------------------------------------------\r\n", -1);
6 {( ^4 v5 b/ g7 b4 v' i1 [
! V# Y% N5 V" I2 ?8 q* s // 主循环
* c4 i% J9 B* o/ G1 [ for(;;)# K; b" I/ V1 s. d
{" R% O& i7 e: t& P) ^
6 o. Q4 Q7 m3 }) X# `! S7 G# Y6 w }
, J; b% [, T1 ^" m& a' I}- W f0 q: f) K8 u* H( ?/ C% C
* v: u: Z. t7 l- g8 D% i
/****************************************************************************/
8 M0 P. I4 @3 `/* */" p; a/ Z# D$ p2 @3 |! T# ^
/* PSC 初始化 */
& U% e9 k9 `; M4 ?! s0 v ]0 p; o/* */
5 T& j) h) r0 H/****************************************************************************/- _4 B4 A/ ?6 |1 t' `' _
void PSCInit(void)5 R e, l# |# `5 c7 N* \* Q$ A
{! [7 [! _: g8 A+ u% }% [
// 使能 EHRPWM 和 ECAP 模块+ W7 V- I* e* B! A
// 对相应外设模块的使能也可以在 BootLoader 中完成
0 O# e" ]7 j% N- m+ j" @ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 ?! N- Q5 }# `8 w PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);' y3 G7 @0 ^8 I e: d9 S
}, Y/ N9 q I0 ?; p! g
- F s+ T8 d: h+ {; H9 l- S3 d/****************************************************************************/" g4 F, }" E# {& J7 S- c
/* */
3 k- F" r) l7 U7 |. }/* GPIO 管脚复用配置 */+ W4 y6 s' U9 {* p! Y# v
/* */
: d% p! Z* W) g7 i. v) G. V3 i/****************************************************************************/4 b" c- d4 o# T) T
void GPIOBankPinMuxSet(void)
7 ?5 h( i S3 y* D8 m: S% w' a{
' @+ n/ s% E% d2 z' V. U EHRPWM1PinMuxSetup();# C- F+ ^' _( E1 M8 g
5 a/ B4 L5 ]! n/ d4 {+ M: j5 N' e // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)% |! H3 ^) a# y( E% l
// 作为捕获功能时管脚方向为输入
' @' P) ~ y, o! E/ S // 作为辅助脉宽调制时管脚方向为输出: y& v3 W* A4 m* Y8 d
// ECAP2 / APWM2
$ b( y& f# w3 t) ?1 L5 G ECAPPinMuxSetup(2);, S1 _2 O: [2 d& w" O. i+ i, y2 O
# n: |" z, \6 R% c // ECAP2 / APWM2方向设置为输入
3 M: Y F. t. K% |& t GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
+ l$ u. L& ` n/ Q}
; j# o) A0 V8 N: H* u$ c% c- X
% m2 N& V+ O( O; W4 x/****************************************************************************/
4 J$ C3 I t0 C$ J- p( d3 y/* */
/ A- z& h4 a3 e: `! l/* PWM 输出波形 */9 ^+ r) L1 `; I+ E
/* */
5 ~# J3 D7 {4 q7 Y7 D7 {5 |/****************************************************************************/9 e; R2 L3 v$ \3 q$ ]+ G4 h5 p0 b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
( d. z) {( y4 j$ u$ p{
$ F- i% z- o$ V3 ?6 { // 时间基准配置
. y# x. G% A1 a7 h7 I9 U8 ]: Z1 @: c // 时钟配置: o- r3 @& y6 i9 V
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);/ N* n. l- e" r9 [! s) g3 T
1 o: w0 P8 V9 V' w6 g
// 配置周期; P- N& k3 K" R# ]% {: \) |
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
7 ?0 W5 y* E0 t& v pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
: N% @0 o( k0 d6 p9 l' O. {* h( U- A: z( b: Z0 y' G+ o i' Q2 P' g
// 禁用输入同步信号7 ]* d- A* M2 R6 h
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); g# w' B8 x7 w/ L% O& @* Z- q Y
" `# F. B8 i. [ J6 H // 禁用输出同步信号' C' C) ^: `7 L% \+ K. |
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
* D# ^5 X+ g! j* |( J- K
s/ j8 h0 s) X3 c3 V) Y // 仿真(DEBUG)模式行为配置
& ?; {0 M- {: I {" ?4 e" ~ C0 U1 ` EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);$ n- G/ D o$ V8 Q& E3 v& o
4 n+ V' H5 p! m7 J0 c+ Q b1 N& e
// 配置计数比较器子模块
4 y- k2 k( Y/ ^/ i' p& D // 加载比较器 A 值
2 o8 e# B# O# k2 @2 l! d# b EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,4 R2 F. W$ B0 }* h e
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
- M8 H) P! t# \
( M; b+ f; T4 G7 J7 c1 g( K" t3 A // 加载比较器 B 值
/ S$ ^2 T3 m' ^; J( H EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,: B; Q2 R" ]2 ]0 {7 Z1 o$ n
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);3 \6 }" x+ P3 J
" [4 J' k, r% q( }5 A' W8 m
// 功能限定配置(输出引脚触发方式设定)
# t, A" q6 g' a+ T // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出! j) m! k& z! P+ n# o* d# V
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
]4 n: W8 K9 r- Y* l EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,2 q; W# t3 \- F* @% C% z- J
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
2 o: t4 U( C- N5 @. D' R& b
6 Y& e9 v. F2 n& ] // 禁用(旁路,信号直接输出到斩波子模块)死区模块3 G; V+ ^: Q9 X6 B t0 W6 _6 O' s; e7 P
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);. L! ]1 C$ f( V1 x8 Q; C7 }
- w5 G. l/ H4 d1 F5 d* \8 k( [! ~
// 禁用斩波子模块8 J& o4 p' d( ]) Z% g3 g
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
7 Y. q$ z, [7 b! C+ r6 O
$ g R' c# J; F4 t. I/ g // 禁用错误控制事件4 j$ X2 B6 H& y$ Y( ]% p( \
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
9 @& ?, U; C! f0 ~1 G1 W EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);) V: u5 d1 B. C* t+ W3 @# B, g; y0 w
& N- ^, q* s. N$ b f8 q6 ^3 Q // 事件触发配置
5 i; E# f1 |8 f* f Z) z. d+ @ // 每三次事件发生产生中断+ S+ q, e& r( b }$ B
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);- s, L- |" U- W8 m4 n
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件' V6 G4 i6 ^% N' E; n) U7 j1 W
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
& i" k0 O; @' _: n. G8 @ K // 使能中断8 F3 E5 i. l; h4 _2 j
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);. m' Z H, I8 D. J# P2 B" n
6 T, J$ K9 X: j0 | // 禁用高精度子模块' c; }$ w, U' B! P8 C& x
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);% U8 o* a/ a% z4 R
' X( K* D8 X8 M* V
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);& |/ d- ]/ q+ N2 m
}
- q9 ?) K# K5 D. B8 @' Q0 W. F* x) }: u* J+ _9 Y
void ChopperWaveform(void) n. n! b R9 J5 a) \# ?
{
3 ^9 ?0 f! m3 W" q# C // 50% 占空比
* o4 n" P! Q% v. W! {; ~& q& i EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
* J: c( R9 q* `' Q8 b: N$ K6 w // 4 分频
6 B" W$ K; y) I# D u EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);$ H; f/ \6 n/ t4 i
// 单个脉冲宽度- J0 ^! m' j) F! r: t' x! D
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
0 L& V* f2 E* @6 {) O; ~ // 使能斩波子模块" Q1 z7 L; Z: Z/ X
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);6 _; C2 I7 \! Q+ [, f
}
$ T9 n; j$ n5 i r+ |! O- U
( G% }$ q8 t3 K5 Z: _$ M$ U9 p/****************************************************************************/
5 W N, d0 M ` j. B7 h/* */
* n0 `( |$ P$ R3 b5 N/* PWM 中断初始化 */
* J( R9 i8 q) s: \5 Z5 I2 Y/* */
6 B, p. B7 g- w! T/****************************************************************************/ m. G' N+ K9 ^) T
void PWMInterruptInit(void)+ g: |8 Z: S- Q2 v% M5 z }* i
{
. ~( g2 _: \' R7 y) |2 e, ^3 t; A // 注册中断服务函数$ Z0 f& C% e: F4 ?
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);6 m, r) Z+ `9 l/ c$ w+ _- q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
7 v- K' Q' e n# S2 ?' M8 @5 Q/ ~+ D( p( Q( n) J& j
// 映射中断( N8 j+ c5 J8 {
IntChannelSet(SYS_INT_EHRPWM1, 2);
" B! B* L/ u1 ?' `1 Y# s& R IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
9 g, h" a4 |2 A1 N. Q: T }' v" N& ^
// 使能中断" w* K. ?' v% v
IntSystemEnable(SYS_INT_EHRPWM1);8 _' D8 U) L7 ?/ _( L
IntSystemEnable(SYS_INT_EHRPWM1TZ);
# b3 a9 k4 m I) ~+ f4 \7 A1 y}
! F4 s2 |% c- i6 {$ V0 ]) y2 a& G" S# y& {2 v" m1 g2 N, n; t
/****************************************************************************/3 H" [8 y; ^4 D
/* */
6 E8 c" @& x& p: j/* ARM 中断初始化 */
$ ]* H: B( a! p/* */
$ s6 [9 x& B) S$ T1 _/****************************************************************************/
' W3 {: b5 q! [6 U8 r6 A4 w3 |% Ovoid InterruptInit(void)
& C0 w1 a0 e, l{
# y- b& P3 I8 }4 S8 E& X; W // 初始化 ARM 中断控制器
; p& O+ J4 q5 E6 d8 P IntAINTCInit();( j/ r* ~) G, A. ~, S: ?% P4 N
. c& ]3 y; a9 ~ m$ b' w* v // 使能 IRQ(CPSR)
8 t' G0 Q5 \2 V IntMasterIRQEnable();
; Z, \# U9 b7 t: K7 _! R
$ q: \! p/ d1 y' U- ` // 使能中断(AINTC GER)' D% p& D& l3 w* s- J
IntGlobalEnable();
" C2 s) E. C f5 l$ V, K# |3 l3 r: R& M( _2 f5 b( w
// 使能中断(AINTC HIER)
m; j0 t( z" L8 J IntIRQEnable();& D% ]( L. }8 B) ]7 ?
}
+ B. s3 b( P% g7 I; B2 p4 b$ `2 _- m4 j) ?/ {5 B( x- W
|
|