+ }" ^: S9 ]2 c1 A5 E* B // ECAP2 / APWM2方向设置为输入 9 J& y% U) z- x GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7] 4 e# T2 ~0 a3 r( _% O6 V}( w" r( c' i; P) u3 M/ [' X
) E: |" t( X* p
/****************************************************************************/ , a* j* o. A: }. E# B& M% B/* */+ r5 Q, R9 y: k9 ?: z
/* PWM 输出波形 */ 1 c, S' ?4 ~& V* V# ?4 o/* */% y& [7 W$ g y' I$ y/ X I) s: t
/****************************************************************************/ * b" K2 s% Y; E7 |3 Avoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio) 5 l6 u/ t# k9 q$ i3 r3 k{0 m4 n) l# ]& P: u
// 时间基准配置 8 m3 n6 h% l1 Z5 R" z9 k // 时钟配置 ; B/ r2 S/ I/ j$ p) Q. {7 O7 l EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);- p0 `9 {# p- d9 |! I Q2 b" m8 m
" ] A% d+ @4 Y6 K7 H! _( \ // 配置周期6 G( a1 }. l& M$ w- K2 w
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, * j" B+ a3 k6 Q pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);1 }8 E0 I0 E @9 x
+ k4 e) L+ y, l' \2 A
// 禁用输入同步信号6 N+ f8 ]4 F$ H. V
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS); ) f! @/ f4 O; r) v' l( R! j% I( L# D
// 禁用输出同步信号 9 v& D. U. W/ ~$ x EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);3 W `6 ~/ m0 T
. f, Z) p7 w% g4 {
// 仿真(DEBUG)模式行为配置- w x7 J+ @4 V. j& e, X, d/ g6 \, R
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);) t$ z: k% s1 i9 } P
; S0 J4 W# |- _1 d
// 配置计数比较器子模块/ `- E7 D: q0 _
// 加载比较器 A 值 : e, j# y9 |& j9 h EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,$ V2 v; x9 g# r3 q
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);* s: `7 l: f. Z) K' c5 ^$ O& a, u
. [" E8 ~/ V; T! s4 b
// 加载比较器 B 值 * R' e: ~3 R/ J* a2 T4 E EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, Z% [7 y ?4 F, B: n% k( C, ^9 e
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);7 u6 L. K& O" u# s0 j- x, w0 n* K
' W6 a* d( K3 H p* F8 v. M // 功能限定配置(输出引脚触发方式设定)4 s. n |$ ]+ S; [
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 9 M0 a, i' w* S5 O EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, " Y6 g! `+ S+ L/ _7 d" B; c5 ~; N EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE, ; {0 u' \" u# ^1 t J EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);: H# W, T/ t+ t
( T$ T0 d' `5 d7 x8 Z // 禁用(旁路,信号直接输出到斩波子模块)死区模块 0 Z1 w3 [; o( y I+ o EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);& t5 m O# S' E6 d& v7 k
# F7 x9 E5 }* i2 w) L# g2 @0 u // 禁用斩波子模块) q3 V t7 h- W1 S! B" {. s
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);, b/ z. F. x) |) O: ]8 D& f
" w8 b! S. [/ h7 V // 禁用错误控制事件# C! S: e+ B f/ s6 i4 u+ b8 J/ L
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT); # e4 T; Q. t# _+ E6 A8 |$ |3 m: y8 ] EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);$ m, @: N7 o% G3 H9 ]: r' G7 l
5 o* N/ a, m2 C | // 事件触发配置 3 o' z: K! j! a4 t) Q& K1 O // 每三次事件发生产生中断 6 c) g4 R# n0 O: w" i EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);9 u& F) h" z8 p) c
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件 , j5 w' |# |$ S$ W+ h8 |4 k EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); 1 m5 @% q9 I3 T. w% p! \4 d // 使能中断0 A& a- F7 H: t7 d* a ^
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);" l, L2 Q r b7 t4 O4 L, ]
, o! J0 v0 w V) y
// 禁用高精度子模块! N" F) X8 b) l, m. i7 _
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); 5 C& L3 I- K y! y7 X) l2 \7 ^& Z' p1 X: K e
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio); " o' X6 z7 G# b1 q} / s, v9 v) }, @. m% _% c% k, _
void ChopperWaveform(void) , v) Q \% l' O: b$ N{ # ?; j3 ^; l6 |1 |$ V // 50% 占空比- ~0 c" Y; H, p: i
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER); % L, ~4 t% i" G% I3 Y // 4 分频 - o* V5 b4 `0 ^4 e$ d4 s% @" e EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);9 V* N# j* Q, G5 K# K
// 单个脉冲宽度, q$ v' m8 V9 Z. h1 P' O5 l
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF); v# |6 ~/ E& W! S! ^ // 使能斩波子模块 7 j: j. [8 W: @0 @- w3 y! s EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);7 q% c) _- x6 G8 ~
}) |- {$ ] I# ^# @( X/ y O
' k1 i) y8 g. X# |* ?( h5 s
/****************************************************************************/4 E/ G/ X" H$ }% Q( x6 {
/* */ ; I8 Z# m* O8 ?+ a: b b n0 i/* PWM 中断初始化 *// P2 O7 p/ h2 H0 x2 |
/* */ * q5 j) p* J* d2 q) v. L4 X8 [/****************************************************************************/ 3 v+ G; X, { {5 u5 R, ^void PWMInterruptInit(void) $ F9 o, [' c1 n) R& h7 L{ 2 a1 |9 O2 n% |6 q // 注册中断服务函数 : n4 v- P+ d8 \2 X$ w D; s+ o6 U3 C+ a IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); 0 a% b1 ]9 b( e: ~( {+ O IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);( a6 g" b6 _) ?& S: n
0 ?" A- H; h$ r. l // 映射中断/ P) g2 `& g; }) x4 G3 Z
IntChannelSet(SYS_INT_EHRPWM1, 2); 3 J# i" n/ v% n4 a; |& f: V IntChannelSet(SYS_INT_EHRPWM1TZ, 3);( j$ T2 ~- J# f: g
" p8 Z, ?+ _# `2 _ // 使能中断" n3 {; i8 l4 V4 w3 o
IntSystemEnable(SYS_INT_EHRPWM1);8 M' M. ~' K& R, p2 w% y
IntSystemEnable(SYS_INT_EHRPWM1TZ);/ R( G# l3 M4 s
}9 @6 l U5 F: J, o4 B
8 U! }6 |- q1 z6 K4 G/****************************************************************************/ y/ ] M, }; L0 ]9 d) c" ?/ L/* */6 A5 i- Q% n2 D3 t; c I
/* ARM 中断初始化 */ & A% r( e& ^" q: I( |- V+ s/* */% r& J$ z8 `; m1 V; }, I, y
/****************************************************************************/2 x9 w' _9 O+ |6 ]5 I$ u# F8 g
void InterruptInit(void) & a) f0 Y2 l5 `2 E2 e: ?% U9 N{' j5 E$ S) V( L( k
// 初始化 ARM 中断控制器 2 t$ A% u' A8 G6 N IntAINTCInit();) `$ e" t9 O. B* W7 J
1 |% s; n* C, ?: i% Z2 P# i
// 使能 IRQ(CPSR)' Z: M; e( }+ X
IntMasterIRQEnable(); % W* Q1 V# e% T" b; M6 R. G + N' t5 i {; v5 d2 W // 使能中断(AINTC GER) ; z( K$ r5 |# C7 E" K IntGlobalEnable();* m6 F! V+ Y) H: P7 l2 m
3 \, ~# O6 ?+ g1 q) A
// 使能中断(AINTC HIER)! d% f1 Y, M* [4 m' J7 G0 v
IntIRQEnable();8 e+ _9 X1 a9 W7 z
} ) v; C9 j+ ]- j' ]' @ B& Q4 |! D+ k 作者: 浙江第一帅 时间: 2018-10-30 17:03
/****************************************************************************/4 V: q% a- K( c
/* */' e$ h2 }" I4 B" ^5 V- T
/* 中断服务函数 */8 v$ F6 a( D6 H- p3 N8 A3 X& `1 O
/* */( a# W( P- Z1 g$ r* p
/****************************************************************************/# E$ m! {9 Z3 Z% I$ `7 H' ^6 c& n
void PWMEventIsr(void)6 D0 _/ V7 c2 E0 U6 s9 F. X4 q _
{ , D6 Z5 p$ d8 y; O IntSystemStatusClear(SYS_INT_EHRPWM1);" t+ R; o+ r2 c, {8 y5 I& B8 v
' r7 e. c3 C E7 ^1 Y/ V
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);, p: E1 y! t. Q1 f/ F
}& Y' g5 B" b1 H
; f* a% y9 Q$ P' f, l3 x# W- X
void PWMTZIsr(void): a$ C% |8 F b1 C# q+ U2 t& ^
{ ( z0 K+ H0 ]( n; P @( M IntSystemStatusClear(SYS_INT_EHRPWM1TZ); 9 [) N0 B; I m) p1 o {) L/ b0 v0 L: j1 S
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);% ]. e3 S2 T( t h
}. C( w: {: q( t
8 N1 o" Q8 n* P8 V: L: G& J/****************************************************************************/ # F6 z, ~8 y" t- H# H, @/* */2 y! o7 q, Q {( N4 e
/* 初始化捕获模块 */$ o5 A& d# s% Q$ G# A$ [8 h
/* */ . M6 E# ]9 ]! u- r, M/****************************************************************************/! U# Y2 \& g; E; V/ W
void ECAPInit(void)8 |* S7 X7 \7 _
{; i* T0 j0 o" J7 l7 _2 g
/*-----设置 ECCTL1-----*/5 z4 ?, i, n( D; o/ {, s. ^5 ]
// 使能CAP寄存器装载 & x+ h/ ]. S' c, q( C+ B# p ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);* ^1 f7 `- ~2 d T) f. p- b. K
// 设置预分频值./ H* f3 R' m; q& S" s6 \
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);" C2 m$ \0 l8 n6 Z$ W( f3 K. `: c
// 上升沿触发捕获事件 * R& w5 A1 g1 ^. x& G0 u- C' u ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0); X5 H# X/ E' ]* |
// 输入捕获后重新装载计数器值.* \2 n/ j) L; H
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1); + u# i; n9 o) j; e* E; X1 |" k9 J* [9 L. I
/*-----设置 ECCTL2-----*/ ) A% m Q$ r7 b# @& ^( s/ K // 连续模式$ d( B. ~0 [* F- e/ b, p8 w
ECAPContinousModeConfig(SOC_ECAP_2_REGS); ! ~# @+ t, E5 \3 i( r' b // ECAP计数器TSCTR持续计数# M3 }* k/ J; ]; x
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);' H- T7 t! K" L! F1 s
// 禁用同步输出和同步输入 & s6 d# C B0 \* y; K ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE); C0 V6 O& H& A/ h8 D1 U // 配置 ECAP 2 为 CAPTURE 模式 & H0 N4 E# Y+ _& M9 y- t ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE); 2 K6 F7 W3 J9 }8 z; M+ z2 c- V! L ~2 |
// 使能中断% m4 t- N+ C# x: N
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT); X# p6 S4 o; H# r. }$ R
} . \$ j3 q6 q' K0 D" w $ A2 M1 q# _7 _1 A: @6 S" Q2 V' N/****************************************************************************/ 1 M4 P# |2 F( Q/* */0 W3 x9 O% x( m5 M- G
/* 取得捕获结果 */* N) _! H, g9 k/ `( y( {
/* */ 6 k9 M0 [# O6 U/****************************************************************************/ % L, a4 Y0 O0 x m9 nunsigned int ECAPRead(void) ( o% Z+ q2 Z% M+ L) D% Z{ 1 f5 I5 _5 l7 R unsigned int capvalue;" o# c. a ?& Y" A
unsigned long frequency;+ W' e3 ?3 T; n! ~
, q/ E! g- T/ R/ h, K( g5 O
// Event1 中断标志% [0 Z" T# e0 p* x0 T4 w
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT)) $ X/ {. R* ]. o$ Q7 B2 I" r y { , H1 R6 B* y( ^6 j1 ?2 g. {: w) S // 取得捕获计数 + x/ d( p1 V/ b& w EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);2 V* P: G- J2 P& k7 X8 ~
capvalue = ECAPResult.cap1; 5 i( [/ E, `5 k, J) h3 L2 P+ J* @, a+ `* K9 _" z r
// CAPTRUE 模块 228M 时钟主频3 v7 l) ^/ `- w
frequency = 228000000/capvalue;7 q" |# X" Y: M6 i, o: a
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);& x, B7 P0 n* U+ Q( N i