. \3 K* \7 P& E) f, \/ M% V% W& d/****************************************************************************/ $ H4 ^! O( b+ s: [ b) o/* */' u/ ^( r% ?/ j5 a, [. ] f* Q
/* PSC 初始化 */ , s) N7 F8 s9 z8 u0 B/* */ ! c3 f9 f. Y( F/ A/****************************************************************************/ 7 H4 }* p; N2 h9 V1 Y( Svoid PSCInit(void)8 C, b$ B/ _" P4 o
{ & u$ A" [9 t5 k' Y/ X, V8 N // 使能 EHRPWM 和 ECAP 模块- a$ Y1 ?$ f8 I6 W- }+ Q
// 对相应外设模块的使能也可以在 BootLoader 中完成5 E5 |; K; v- A) f
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);6 j; r4 j. q& _1 l" F" W
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); 4 l! r! \, Z! Y% h} / N4 D7 I/ k( n; l7 g/ l" p9 V! _+ P. A6 B' a* b
/****************************************************************************/ % o$ ?; ] E- e2 U/* */ , l9 z8 o! i% \3 g9 g. a7 c0 U& i J/* GPIO 管脚复用配置 */- S/ |$ \4 O9 d. u O
/* */ + i* z% T, F8 M9 u8 x/****************************************************************************/ + o* Y, ` A8 G9 L9 q: U0 rvoid GPIOBankPinMuxSet(void) ) M9 E! l! n, A1 P4 @{3 h! N) K# N: ]! u# x$ N
EHRPWM1PinMuxSetup();& R* @; |* g' z! L
0 h2 N; I. P8 V( N# K" I3 l6 j // OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)2 ]( M, U% \- K
// 作为捕获功能时管脚方向为输入 ) M" g# w0 t* F* d // 作为辅助脉宽调制时管脚方向为输出, K5 A2 G0 d3 a, G# f
// ECAP2 / APWM28 v$ r; a2 C, {5 w, }
ECAPPinMuxSetup(2);$ ~# E& ~ d' u
7 i; ]( v7 J, Y( s* W
// ECAP2 / APWM2方向设置为输入 $ A+ Q4 ]1 |0 C6 |* g7 @ GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] 6 H D V F+ J9 u! l( O! C}2 N1 ^% w. b: ^7 b3 B- y
6 W4 |1 |0 J% o# {- x' D/****************************************************************************/3 Z8 _5 s% g& i+ M; u7 @, ]5 @
/* */ 3 W! V1 `; m8 ~/* PWM 输出波形 */) b- y0 r _9 s" ?. }8 T; I6 `
/* */) k4 r, ^5 N* {: P0 Q5 m w# v
/****************************************************************************/ ( |: u$ Y, ]) ~7 F7 f$ rvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)9 E0 r3 q6 |8 L
{9 |* a4 g) s) w* C: U7 |7 ?' t
// 时间基准配置 - b! ~1 }3 d W4 R // 时钟配置 + d6 W5 [( b0 U; {6 u EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ); 6 W- _8 I l/ {/ Q4 c0 s9 y% U% W1 A9 G3 ]3 X- N8 m5 W
// 配置周期/ p1 M& Y) z' {& j" C" @
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,( v: s2 f2 u) O7 ~1 ^% g# {
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);4 G6 l$ s7 i/ y+ |" M1 `; b
2 l7 T7 B& u4 D& E$ s
// 禁用输入同步信号 2 M; U# V8 e% j" ~' r EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);: B: a+ r* e% A# Q) l z$ k5 r7 N
7 V/ S P. }" Q+ v3 L/ q$ N
// 禁用输出同步信号 5 W, S& Q6 ?, h4 y& X6 {, z ^ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE); * P% y0 C+ `9 s7 ` : [- j" u9 T! q& ^4 f% s A u // 仿真(DEBUG)模式行为配置! n9 Q& j4 V2 h6 i) P1 L; y C4 E
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);: a$ o) C6 _3 e! h* a; `2 N6 O
$ b" t) f9 U6 @. b W
// 配置计数比较器子模块3 R( X8 H5 ^: N. h
// 加载比较器 A 值 . p5 V! c, ]" q4 Z, m* A EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE, ' s2 k8 T. T4 v: B9 o EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); , T( I6 K8 R4 O - x! A- k3 x# ~8 x // 加载比较器 B 值! q# `& `5 a5 l2 @0 m
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, 6 d2 O) ]; l+ R: f8 u+ Q EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); - W! r; q9 x" K2 T i" n0 E- R9 I2 q! A, P* Z8 M // 功能限定配置(输出引脚触发方式设定) $ i; e7 R3 z+ q! [& c g // 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 / \# ^ F: r% k7 l EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,! L5 k3 F# \! N4 m% P1 w: j" ~
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE, ! E3 n. m- W6 M# w0 l+ _6 E EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING); $ d' E! M& L* ~7 D$ |5 E2 ~ 3 K7 W' Q( U3 h$ W; i, e9 w! K // 禁用(旁路,信号直接输出到斩波子模块)死区模块 4 o6 k* P. Q* q! ~' L% Z+ T3 s6 \ EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);2 b6 o; s9 T2 D) G$ X* n8 ?
- P: p9 N1 l* p7 V* s // 禁用斩波子模块, f6 A( a" p# n
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS); 5 H0 R2 D2 Q$ y+ r( c. T' A, D5 c2 g2 k* V3 N! J9 D; A8 u
// 禁用错误控制事件 5 R+ Q8 z& C% H; w4 _$ k5 h EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);# Y w) B' R# [6 j! c
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); % s* S0 C: L7 A; M7 o & z( @# d6 z* i2 ^5 |, N6 p( H // 事件触发配置 E- q0 z- ?: ] // 每三次事件发生产生中断 3 P- d) k/ Y( f9 l: B$ K EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);+ q2 b& d o7 b: Z N. E6 g2 J$ O# F
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件1 c5 t- I9 y4 F
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); ) _: q+ R1 [! I( Y/ Q- ^ // 使能中断/ B. d2 r r; w, S
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);3 X0 q: V& c- M, J' u
) \5 u. x# _) x/ T, j9 P& }
// 禁用高精度子模块 j+ ^% `+ w0 G$ I
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); # f! {/ j- L- U( @! `( Z% w& O3 t- S* v+ ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);3 d% m+ i! X: ~3 C
} 4 V; c/ e2 u# \% ~ 9 V$ P) ?0 k% U7 |# Hvoid ChopperWaveform(void) ; P7 L8 M6 q3 B% T. x9 A{ 2 s7 Q5 t+ A/ T6 ^ m% P9 Q // 50% 占空比5 q/ u1 L( D5 |. t, s
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);. b6 E; V% \0 `7 o7 h$ _2 N C
// 4 分频! K! P/ B5 p! a3 l
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);4 o! p8 _ C# o' v/ g2 \
// 单个脉冲宽度( ] l* r( ?9 L/ L5 f' t: q0 Z5 n
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);$ t0 B7 o. |% l- ?7 _4 Q" Q
// 使能斩波子模块" {* ^4 ^6 m" L0 v' n
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);/ U* @, U( T9 E: B' @+ u
}5 r) [! r9 g5 M) y
4 f; l! w+ y# y. I$ s
/****************************************************************************/1 \& k8 E- I- J/ Z
/* */4 L! A: ?( {4 M
/* PWM 中断初始化 */ ( O4 F% D% W; y+ `% Y- I- T/* */& X% B; \6 w5 ~+ r
/****************************************************************************/: R5 \" A& C; V; c
void PWMInterruptInit(void)# R b; A( i1 r8 n7 }
{ 6 z! }. O# p, T! M7 i9 l) ^ // 注册中断服务函数5 v1 a& U$ _$ f2 M1 e# W8 e
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); 9 a; t1 Q1 W0 {2 D IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);% @2 Z& x% E) R
- H( y* `, }- `, H" w // 映射中断- M3 Y' x; F. v, E5 R M
IntChannelSet(SYS_INT_EHRPWM1, 2); + J+ E" w; N% b* i. ~# f( n. ]+ T IntChannelSet(SYS_INT_EHRPWM1TZ, 3);/ s N# S1 d$ `0 W8 ~7 X
" J9 `* I4 h+ c+ |+ A // 使能中断, m/ F! T) a4 l- C" D
IntSystemEnable(SYS_INT_EHRPWM1);6 h' }! X! x4 _1 ^0 J
IntSystemEnable(SYS_INT_EHRPWM1TZ);7 v5 U- l% k3 o1 n ~0 d
}" F5 J; {5 W4 a) `0 S/ q( u
5 f( V; x# c. y: t9 @! q
/****************************************************************************/ 5 s% t3 u8 c" [- d/* */ % i4 m: f3 M. p2 I# }/* ARM 中断初始化 */ ' E& U. d2 Y. M/* */8 t0 I* e$ X3 X4 Z8 G2 x
/****************************************************************************/. d. u, M- N- U9 O1 K) a. V: x
void InterruptInit(void) T8 Q0 X4 B& D! o+ ^' j{ 9 `% k9 v7 Y- p6 q9 @ // 初始化 ARM 中断控制器( l. c2 j' Z* X8 K$ r9 k
IntAINTCInit(); + o/ {) m* T9 F. _, l: o, j3 m. v/ T9 h7 [6 _! f u3 ~* D* G
// 使能 IRQ(CPSR) , h. R" n1 T1 }# h0 z8 n IntMasterIRQEnable(); # @% h( w( {! @( W" d1 O) N& K) u& @% R8 D6 E) s3 O+ _. Y
// 使能中断(AINTC GER) $ G5 H9 u/ }& K! n IntGlobalEnable(); 1 z% _6 r8 J7 r2 X# Y; [/ }* X/ f4 X4 F 9 s! M9 P m& ?1 \; Y; x! S) ^ // 使能中断(AINTC HIER)8 J% I8 W) q/ y; A! H
IntIRQEnable();6 ~4 _& U# k+ o+ _ y
}9 C8 ^ [9 B- O/ M: Q/ H9 ?
* W- C/ s. N Q& z4 z$ N9 r 作者: 浙江第一帅 时间: 2018-10-30 17:03
/****************************************************************************/ ! J0 c9 j2 n1 t/ S+ L/* */ ; g3 S+ d* I. ^' e. F' M) w( R/* 中断服务函数 *// R4 r. k% e& A, A
/* */0 p! P) d8 m: w% Q
/****************************************************************************/ ! v( r2 Q/ h m- q4 `+ rvoid PWMEventIsr(void)4 w# q7 ?, w0 @, c: M: Y5 W/ J
{- z( o, b$ S Q! F0 f, d
IntSystemStatusClear(SYS_INT_EHRPWM1); 0 h. ], J7 M, p$ H/ k9 a / I2 l5 E [3 t | EHRPWMETIntClear(SOC_EHRPWM_1_REGS); 0 G$ _! X) `. O' y) P3 x4 T}3 Z7 o! v' w+ K5 t' _5 |
# X9 a: I1 P5 O. e avoid PWMTZIsr(void) 3 ?9 T( m e: a1 ?' v2 G* V5 G e{3 z" u, D$ t" D& _5 f: e$ P3 L$ i
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);! T, P Z3 M, ~# W* O/ v1 h
3 O* U a8 t# B EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR); 3 i! i: U3 O5 u}. L1 w; @ V9 e; v4 u- k' h
" t9 u* R5 q' v. R: N% h/****************************************************************************/3 z1 y! m3 x# W: x
/* */: k/ C- l2 {3 V
/* 初始化捕获模块 */4 f* _; {7 G/ ]( u, c/ g
/* */) [6 A& I. F4 k7 V+ F0 s, v
/****************************************************************************/ ' X. ]5 W+ v* vvoid ECAPInit(void) 3 q# x/ P' |3 `/ _ d{ l9 ^8 Y( S% r8 h
/*-----设置 ECCTL1-----*/ 6 v) V* x" B! P8 o( _0 Z3 j& ] // 使能CAP寄存器装载: n2 ^) v m2 j4 v
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS); ! \0 a3 L& q7 G! W z // 设置预分频值. 7 o0 g% u6 u- D ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0); , j/ O1 A& f+ ?9 H# H // 上升沿触发捕获事件: K; v( s4 g6 Q
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);( H1 A$ U6 ?4 i& h0 J9 v; {- }0 K! F
// 输入捕获后重新装载计数器值.5 Q! f/ Y h) Z1 f2 x
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1); " ]3 h. r+ ?, U$ }9 J" M, K) m# `1 G" b8 x0 C+ {0 U) H( n
/*-----设置 ECCTL2-----*/ 1 U; a1 G( X6 i // 连续模式 ! |* A/ Y# \- a3 y( d# S/ K: J* H ECAPContinousModeConfig(SOC_ECAP_2_REGS); : K& Q, B$ m* n4 a // ECAP计数器TSCTR持续计数- n3 y" \' @+ ^( n/ @# R' n& @% p
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' S; I0 S2 [9 x8 X, O! z: |
// 禁用同步输出和同步输入 / ~% h# w2 L# E1 ]& [# x ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE); - a% T5 n3 `3 Y8 b2 F6 ^ // 配置 ECAP 2 为 CAPTURE 模式, x- p K6 a, O; }! u$ @
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE); 8 l! _# U v9 J7 W5 q" z1 `) t: v ! Z: N. ?; R+ W7 z2 a9 v // 使能中断) ~& X7 b2 e$ W/ L3 S: z- \
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT); + ~+ v; P) n* i: P3 n}, ~5 [" z( Z3 p% {+ V* A: Q
7 s8 u! Z! R/ u, H/ v$ X/****************************************************************************/# }2 A) a, m" U: J/ u( e+ O+ B
/* */6 L% s6 e) @) Q; x* O! P G
/* 取得捕获结果 */ . J1 z- E) h! I5 S0 \/* */# J% Q! [9 T0 M, r" w! y
/****************************************************************************/ 0 w# J6 O3 T8 o2 A% Wunsigned int ECAPRead(void) z1 V' u5 @9 [# D Q: v{ 7 P3 \) Q" ?7 Y) j) J unsigned int capvalue;, Q* t. r* ]! A0 V* v7 G4 r
unsigned long frequency; / j( W& [& o" D0 b; s2 j$ O. J) @# n. U' ]+ d3 y
// Event1 中断标志 + y( d; k0 W/ P& X; l& E# n if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))- P! a7 B, k0 C( e
{ ! y t7 m! X+ ^6 R6 c6 H! ?0 @ // 取得捕获计数* n8 O. C" ?" g/ D& x0 H9 H
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult); - q, ~) _* M* o/ Z" j; m# K1 a capvalue = ECAPResult.cap1;% H0 k. @2 Q8 @6 o
! y0 T' u) ]3 n/ z: p. r
// CAPTRUE 模块 228M 时钟主频 , B4 B8 ]& V$ i1 [ frequency = 228000000/capvalue;% d2 o9 N5 \% z' r/ `) y$ |; z1 \
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);0 L7 v- M" C0 T4 y; H- |& ?
6 S) T5 m& m# S! p
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1); 4 h7 e* m! E9 G* W0 y$ [0 e// IntEventClear(SYS_INT_ECAP2);5 D0 h/ k$ O* v$ M
} % J; x. L3 s/ ` return frequency;6 B2 N2 X ?8 _1 s/ {
} . N: u/ k1 e# p" L8 m作者: 浙江第一帅 时间: 2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波作者: 广州创龙莫工 时间: 2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。 " U8 S: p1 R7 C% Q/ q[attach]4202[/attach]作者: 浙江第一帅 时间: 2018-11-1 21:27
可以给我发一份吗作者: 广州创龙莫工 时间: 2018-11-2 08:51
如需获取相关资料,请发送您的客户信息到我们的技术支持邮箱:support@tronlong.com,我们会给您提供相关的网盘链接。