|
沙发
楼主 |
发表于 2018-10-30 17:00:28
|
只看该作者
/****************************************************************************/
6 z3 {; j' ?; E( ?/* */6 ]/ ]- y; P% L, t# C+ K" }
/* 宏定义 */
8 w% e9 D* X5 e1 k$ i. {6 P/* */
- E9 W) y7 L1 ^& J, J6 r7 j( I( |$ Z/****************************************************************************/
" g# S3 j2 s2 @! @// 软件断点
. Y: K& x ^0 `; ~# @4 o3 _#define SW_BREAKPOINT asm(" SWBP 0 ");. n8 i2 K& t+ E2 x$ o
/ N% B# M# l" p% n2 `6 W// 时钟分频4 u/ c; n! K. I4 _ Y
#define CLOCK_DIV_VAL 228
- }& X1 V: z" b/ X4 i
' x" V: z4 I, f5 H. b/ X/****************************************************************************/
+ _& Q5 w" n* ?- A/* */
2 C! [, Y0 ^% r p/* 全局变量 */
( U* K, m7 D: ]9 o$ |, i. e/* */6 g( o3 B3 h) m8 C
/****************************************************************************/
0 |* Q& z6 A; _* K. ]ECAPCONTEXT ECAPResult;: F4 z' G* \* {2 c) }) }2 z$ o+ A
; s# j J( Y5 i1 W
/****************************************************************************/
3 I: v m+ K* K L! o: h% c/* */
- s' p. l' K* b5 p, m' K2 j0 p/* 函数声明 */
! O" t6 l. j- M9 j4 N2 t: g/* */7 S) f! m$ b3 ]2 b
/****************************************************************************/
. @% m' o$ N4 y% C8 {3 [6 C; A// 外设使能配置
! h7 ?8 R3 k: t3 `( ~+ X+ hvoid PSCInit(void);
& w0 ~1 S* }/ Z) _! z1 T! I( s8 {. p" l. [, s; [
// GPIO 管脚复用配置+ t) Q6 H; T' Q, K( ]$ A2 C
void GPIOBankPinMuxSet();7 X# h/ P9 z3 n4 ]$ I. Z+ g! k
+ B9 R- v! }& ^) e9 Y
// 产生波形
+ j! N0 g/ }7 x) r6 b. u& \void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);/ Q! b: g/ Z! _" |) X. P
void ChopperWaveform(void);
5 F: ^' E% \0 c4 g( h J
% _. p8 H3 e% x; U$ N5 ?// ECAP初始化和读函数: R2 z! S! H7 L1 `! z$ T7 R
void ECAPInit(void);
$ p3 U, L! r. L* J- @1 h/ @unsigned int ECAPRead(void);% P1 ]) N* w F; m' L3 U: E
1 ^$ Y5 ?) F6 U& S8 i
//ARM 中断初始化
6 n5 F8 [! q, m* G" rvoid InterruptInit(void);
' T) N. k! T# Q. K) N& [1 \$ H8 t- g
// PWM 中断初始化: a A! q+ ?0 Q* w, l3 f5 K! l
void PWMInterruptInit(void);4 Q @1 Z8 x, r3 e# E* }; @
// 中断服务函数; |/ T% \% L1 a1 w
// PWM 事件3 I% G. c* R; E
void PWMEventIsr(void);
& I( g+ r) j0 f$ G: q: l// PWM 错误控制事件
- |/ x! N7 @) f9 H3 q: Evoid PWMTZIsr(void);+ y5 R7 h/ a$ E0 O& q
. Z; A& y# c$ f) n! Y! z" g7 c/****************************************************************************/
) [! B# ?( [ V* n: ~/* */
, Q% ~# Q- A8 P/* 主函数 *// s1 l1 F/ }6 h) |2 Z4 ]0 E
/* */- m" i3 t2 F4 `3 K6 z# v, I: n
/****************************************************************************/$ [9 J5 @' ?2 N+ O6 `8 ^
int main(void): O8 Y- M; G" @$ r1 ?/ L
{
! f+ D( p6 [. x3 w# [ // 外设使能配置
/ |( I: L/ N/ [4 T, q- P PSCInit();
! D1 I. e( I0 w( K6 U9 r4 |! {( H0 B1 P! ?' C" U- `
// 初始化串口终端 使用串口2
0 V0 s% w- f( P$ V- h UARTStdioInit();# d. q- C( `4 ^1 R' H
" y+ s) P$ E! n& p1 {1 f8 Q
// GPIO 管脚复用配置 q% J1 M% Q& x6 f
GPIOBankPinMuxSet();9 M/ ^4 d) \2 z+ X7 k: k
- D! }% y. k1 p; _8 n
// ARM 中断初始化$ ]" a% P3 v, |% ~/ J9 N/ r( E
InterruptInit();
- Q1 ?+ [- X+ ^$ M
- ?, x( N* b; v* G! m // PWM 中断初始化: A0 x& y) D& c0 Y
PWMInterruptInit();
9 J1 T! D) v# b! a n! L/ ?( f f: h2 `
unsigned char i;
0 y: H2 z) p+ I8 ]# n# U unsigned int j;5 I3 K% `4 E5 R& W6 t6 q# _8 p( `+ l
3 M! k. n: {1 M7 R0 F
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 H" J# c; s, F* ~/ b% N7 h UARTPuts("------------------------------------------------------------\r\n", -1);- W5 u& [' ~% a0 C
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);+ q1 `1 j8 z. {3 ^1 G9 ^3 J
// 产生波形
2 Q0 T# w- W% R/ b( D, M* K, e PWM1ABasic(25000,50);
4 C. Y: {7 d6 `
; [/ z" H9 O) k( j# a1 p UARTPuts(" C6748 PWM Test Over!\r\n",-1);; m, I; o" r3 W+ ~# x5 J
UARTPuts("------------------------------------------------------------\r\n", -1);
0 T) p" d2 ^9 m( y" X
( ?- K) ]' F" d- K7 O: n
5 u/ g/ s4 G" j5 C( D% Z3 _" y: F9 D4 I( [
UARTPuts("------------------------------------------------------------\r\n", -1);- v% B- k; d) _! N
UARTPuts(" C6748 ECAP Test\r\n", -1);# a- W! Q1 O9 I1 g/ {; t
// ECAP 捕获初始化
$ d0 X! ]' q! B. m ECAPInit();
. ~% p1 B* T1 P) ]7 A, L7 v UARTPuts("Initialize ECAP.......\r\n",-1);. n3 ?3 t. N4 F5 ^
for(i=0;i<5;i++)! B3 v/ Y. G& H6 P1 j" q
{
6 k- F- p& {8 J8 p8 h$ } for(j=0x00FFFFFF;j>0;j--); // 延时8 X4 F# }% b2 v$ Z3 _- A
ECAPRead();6 b- i# j. ~% F" I) I$ E
}( k ]5 d8 _& T1 _
UARTPuts("\r\n",-1);* A! X' L& h, {. A0 {9 ~
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
' F: G8 }8 q8 s UARTPuts("------------------------------------------------------------\r\n", -1);$ a& I. R4 c# \0 H4 V1 k: ]
( w$ e$ Y5 W. o9 o. [3 D& Z7 Z // 主循环* F+ g! `, `! z1 D K
for(;;)
+ L9 `* [' {4 b$ e& D9 W {
/ n7 @- ~4 T5 o4 }+ l# ^4 N8 M0 [! G4 ~; S8 u5 Q
}
6 ~6 P- l8 Q* z0 D}0 }! K" X+ q: i2 o
& u. _& B- U6 _4 i4 v+ {
/****************************************************************************/
/ ?- i* F7 b# h6 {8 [" ^7 P9 l/* */' m, M* [5 F- S0 ~: Y; c
/* PSC 初始化 */& {; M h2 {0 J; i F: D& E: u$ y, Z
/* */
! T8 M6 o& Y/ K0 Z: P# y' G) T/****************************************************************************/
. h; N/ `- L5 ^6 Y2 Avoid PSCInit(void)& d1 \4 x, m1 o9 C5 X& d+ Y
{2 y! ]5 ^! ?- G' t, ~
// 使能 EHRPWM 和 ECAP 模块; @) K( Q8 \' e0 H3 v1 `$ A& a7 |& F
// 对相应外设模块的使能也可以在 BootLoader 中完成2 s9 x7 i6 U9 U5 w. R: Y
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);0 k9 D5 G/ s3 O( {( ?0 g8 F
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);* O3 _3 t! a `. X" `: q
}
% R" j% Q' B7 E8 z+ ^. B7 ~$ C) D% L4 \+ B- Y. L
/****************************************************************************/
/ ~( k7 L, O/ C `4 V/* */1 p v( z2 I; J0 O
/* GPIO 管脚复用配置 */* `3 N% T2 N; }: }0 B
/* */
3 S) e# w. ?. a- L: a* j/****************************************************************************/
/ }' a5 h: y9 f9 a, t. Pvoid GPIOBankPinMuxSet(void)
6 i1 q! \: n% }. Y% V{
( t) Q+ u1 ~/ Z3 H# P1 g EHRPWM1PinMuxSetup();) d2 q9 e# I+ F9 s
# z- w: g3 A1 y2 p: b
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
% i/ A% Q9 I2 c // 作为捕获功能时管脚方向为输入
( D/ O F# I+ J8 Z% y% I$ v // 作为辅助脉宽调制时管脚方向为输出
3 `; N2 _7 B" {, T- @ // ECAP2 / APWM2
9 ^5 H4 t/ u; a9 }* I# A ECAPPinMuxSetup(2);
3 O2 b- {6 ]8 R6 F. O, {
: t X0 P7 h! n( |$ L0 a // ECAP2 / APWM2方向设置为输入, z! O f% Y/ t: T' X* j* R
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]- Y2 \, {: ~4 G& X1 B
}* _ G$ q) N( I- U% C
0 R! x4 ^& `- P1 }5 p+ B4 b/****************************************************************************/
" G* c$ ~) M" G( g2 D$ T/* */
7 D2 u8 _9 w4 S8 G) S0 F/* PWM 输出波形 */
& I' J$ }$ L+ `, a6 k8 T/* */
- k2 U, ?3 ]2 K3 x4 b/****************************************************************************/
6 Y4 i. w/ I- o7 F2 ivoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
; p6 R' m- G' u j j- F{
: r, _8 [6 d2 E% y, m# a- O // 时间基准配置
' u" j, H5 |, \- g/ g/ x8 M1 n5 V. ] // 时钟配置
% {# `+ A) e" K% b EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);" E/ H) c. H# @. b3 T5 M
* q" S! u; o0 s; H // 配置周期
; H# n& P" R9 V1 q/ k EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,/ ]" ^1 D! `0 p9 G% x
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);! C: t. d% n, D7 A* p" G+ ^
: I# r' k, z. y // 禁用输入同步信号2 A" b" Q% f6 r# T
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);5 ~ h( n" u& S9 z! c% P
4 ^1 E0 o; q1 p+ b* j/ ]4 w+ l // 禁用输出同步信号) g) B1 E5 ~$ O9 q/ X1 h
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);1 l! i: L. }3 o2 _1 ], D
, V5 p+ r( g: }! c. r* K( x0 ^6 G // 仿真(DEBUG)模式行为配置. {8 [# F! Z9 ` f+ Z X% `
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! Z7 s) G. m, J b3 b3 g* K/ g } ?0 o( p7 x. U* E
// 配置计数比较器子模块% t' ?1 D" N" ]! u. z8 p
// 加载比较器 A 值
3 p! d" n% A" M' S: { EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
" f7 }4 ~& L* y9 ?, j1 ]" p9 n: u EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
% ^% c9 U; c& K! }( B C
& T3 ~$ D, g4 n: q$ w$ f // 加载比较器 B 值" U2 J+ y0 ?+ w' \6 }
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
7 h( z5 B7 A4 g# h, C; q7 z, V EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 q6 J& l$ t' ^( u6 f$ ~0 a4 T4 K) u& t1 f5 I8 Q, L
// 功能限定配置(输出引脚触发方式设定)/ y( ` f8 i" Q" T
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出: J: P/ E$ `/ _8 f( E# `' H
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,$ q; q' b7 L ?
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
- C: O% w: l. d" }. c EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);" T) |8 Z! F% K/ g
; R; M4 C/ g- e* ~: v // 禁用(旁路,信号直接输出到斩波子模块)死区模块* q1 l4 p( h0 ?- I B) K
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
2 n8 }8 t& U" P
. v4 n2 u+ H0 e7 E& _, B // 禁用斩波子模块6 b5 |$ X8 X& W; `0 l k
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
5 i+ _8 D" T5 v* N! W1 @" H2 S8 _ d8 W/ g+ ^/ H" |: u
// 禁用错误控制事件
7 P; a F9 o- ^3 B* J3 Z5 n+ @ EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);1 ~ y6 @. j( W/ j$ N X
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
' I8 M# ]4 ^, P. `2 D* F0 ]8 z; R4 z i) C
// 事件触发配置
Y- Y5 \: C+ |* f // 每三次事件发生产生中断4 A! _% \$ \5 I) F4 n% K
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
$ v4 R) q6 C4 I6 q // 时间基准计数等于有效计数比较寄存器 B 值 产生事件
1 ~9 r6 o! p+ l+ \ EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);7 I1 p% p9 |! N
// 使能中断
0 G/ ?; R$ |4 B0 W EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
/ I, @- n+ A. r8 g9 b# J8 ~, j6 V/ N
// 禁用高精度子模块5 A* U+ G# a) m: A
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
/ w7 A/ p7 |, @+ `: A5 z1 c, c' R* W; }: v6 J: s7 q7 x; X. G* }" |
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);5 y$ Y0 C7 T9 \5 Q% n5 m! G. r0 W+ x
}
6 i$ f' T* L1 v$ _5 P
" T5 g( ~( T$ D4 w" ? yvoid ChopperWaveform(void)+ c3 _1 b1 {' z0 f: Q: |% A" \$ N
{
: y0 p' g! v3 i' p3 d" L // 50% 占空比
* Q0 b! O. f/ W9 O) I7 p4 e EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);9 r2 O" z* a* W1 N1 g6 L
// 4 分频% ]# f& Z1 ?. I L
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);) w: L9 T) n' T
// 单个脉冲宽度
! _. U3 U3 h2 `5 z k |9 q EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
! Q4 H; {0 ?( E6 w; g1 @7 m" e // 使能斩波子模块8 [2 I8 B4 J9 Z
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
+ `7 A. B( U5 b) V) e}0 X+ T. [; y1 W5 S& ~; w" t7 A
; n1 ^' ?7 H7 A) K+ |! a8 W
/****************************************************************************/. ?% y% y# _+ a2 ~8 l& f
/* */
/ f) `6 q% K, F0 l# P) [/ n0 f/* PWM 中断初始化 */7 C, g! f7 S+ L
/* */+ c& z5 v2 J9 L5 z# e9 g1 u2 Y
/****************************************************************************/
: e; d, Z! e- q: C* {* s0 Ovoid PWMInterruptInit(void)1 Y* \; E1 P$ Q3 W1 z7 \7 t
{
+ J% u4 c' w( @4 Z0 K // 注册中断服务函数
9 f2 w; n3 I" |) V% i: a- @+ y1 l IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
; K$ _" |7 G# M# B5 \ IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);# I9 `! K% h& Y+ Z! D
4 ^4 O) G" m/ f3 v
// 映射中断# W4 D1 ~4 O' O) e" E
IntChannelSet(SYS_INT_EHRPWM1, 2);
0 e0 J: Q- h. B. j+ N( |$ c IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
5 n5 u. A, q# p4 ~ a( h0 V5 `5 P3 R' [4 z- O
// 使能中断! l" [" D" d" k [, Y0 c+ `
IntSystemEnable(SYS_INT_EHRPWM1);- g4 X C9 s l* t& [
IntSystemEnable(SYS_INT_EHRPWM1TZ);" t) H3 P. e9 W6 j2 V' s2 b7 Z: X
}3 r5 P5 L" d% e0 V/ j/ ^
/ e( G" U6 y7 A, c% h W/****************************************************************************/
4 }. J# Z7 j& @- |5 y/* */
% s( i6 x) Y2 Q8 g# p/* ARM 中断初始化 */' q2 v! \) K. {$ `4 j# |
/* */' T7 Y! i& _7 x* m+ F9 d
/****************************************************************************/
$ V) L h" x7 F: W1 Tvoid InterruptInit(void)
4 n( x" m2 c8 E" V{% m X* B7 Q7 I7 N6 {
// 初始化 ARM 中断控制器
R7 J! k* w- D" E+ b IntAINTCInit();
& g) l$ F; _* K: h' H$ J6 B) W3 S
0 ]6 x; N6 w5 k. z! p // 使能 IRQ(CPSR)6 `! o2 n3 m, D! n- q
IntMasterIRQEnable();
* A: N: k4 Q/ g; t B, p
! S6 {4 m! M& ~* `4 U // 使能中断(AINTC GER)
" V. J$ q/ q8 \1 v1 t5 ^ IntGlobalEnable();
! V; F d" {5 z! S9 v6 d: j6 P
; @$ S; X# m( A# k. A // 使能中断(AINTC HIER)
9 w$ c6 H7 \3 T/ a# { q# X( F4 r IntIRQEnable();
. T/ U& A; W6 ]$ l' P$ m2 ^5 b& k1 A}6 ^; e3 N2 w; y3 P# @# \
/ N- S, B6 }1 `% f0 Q
|
|