% t7 ?8 v6 ]7 g+ ?/****************************************************************************/6 d* K8 L9 S8 J3 Z
/* */1 v! c g2 X* m! u3 }9 r- t' m
/* PWM 输出波形 */ 7 Z( ]! Y- q4 ~/ j& n3 w/* */ . S3 _3 O) o# q/****************************************************************************/ 8 V# ^* u7 b9 vvoid PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio); x% p- s! |9 ^: j9 m
{ & q, A3 A/ O8 Z3 L // 时间基准配置0 U# w2 z) v* J m# H2 V
// 时钟配置 + {% M) Y% R. p+ t+ h EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);( k: z1 E' `+ T. S B+ ]: G: |' G
0 c3 z6 j8 m1 N
// 配置周期( n$ r' V$ F: \2 r4 s+ ^; y
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL, & Z$ i; m/ A2 k6 B! g9 v pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE); 8 b) d0 P9 ]5 g1 z" |1 b+ R5 f. ^# ?, ]
// 禁用输入同步信号 6 L6 D! a7 ~1 s0 i; G( a EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);& \& ?% k2 W/ ?) N2 I/ `
3 V# a) B. C6 s4 C) @# b6 c p& A // 禁用输出同步信号 - f$ H6 u( q. v/ v. T! j: t$ [ EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);% d2 o$ d" T8 i
/ f& X4 H; e! _6 H( X // 仿真(DEBUG)模式行为配置 : Y* p; X6 B( I# l; n EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);5 G% ~$ k: v% m3 Z$ I! f% D
- b( J. u7 V/ Q
// 配置计数比较器子模块 9 s# J9 ]: W% g5 o( b. \ // 加载比较器 A 值8 R* \' h: m9 I; x4 F. b, @3 W4 l
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE, / a! x4 M: s- ^ EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); % z: l A. p1 d" N$ j, V- V1 w0 p/ [* p- c# u- `2 c7 ]% R9 g
// 加载比较器 B 值+ `. s# d! Z2 V+ k: w$ C& b! ^: r
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE, . c& F8 ]" p- V/ [! A- l- T EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL); 8 E' @( e7 [- C2 U6 A8 ?# F5 s7 `) \. V4 F
// 功能限定配置(输出引脚触发方式设定)! ^4 I3 b$ Q" ?- }" J
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出 : C0 w) u9 K5 ]$ |' b1 D" X7 B EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING, " G- H3 [( P4 f5 s EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,6 A, d6 u2 q- R3 B. j; u% A
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);0 P( @$ R: ]5 b$ ~8 N8 P |3 K
: U& Q/ m. `! B V0 J4 h+ V( ~ // 禁用(旁路,信号直接输出到斩波子模块)死区模块1 [0 s3 f2 a# R: W; \' o
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);+ Z# I' x7 [4 t) i, n6 T
9 x8 S/ R$ L& ]- B6 x( i7 E- ]% x // 禁用斩波子模块 # f7 J1 S1 y1 G% d! F) E6 Z EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);& ` `3 R* B0 ~ I
$ l& E; ~4 ?0 K+ S4 i p0 X
// 禁用错误控制事件# ^; a# W& ?) E" O2 K( B6 l o9 Y# L
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT); ! w( a0 j0 i, [, H) u2 X! O# T EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE); K' o/ D/ [' F, a) U0 P6 L , ?" f) U/ O$ K5 a; c // 事件触发配置3 J0 r4 C1 F6 A& }) p/ }- V
// 每三次事件发生产生中断9 R7 K9 y$ m- n8 |: }3 H! a
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT); p4 l; b: Z& i& ~0 ^& `
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件7 O* ~) _, a/ q% D5 d
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC); ! s3 [( J& F. S1 O- ] // 使能中断 7 O; y) K' S2 U# t! G8 X6 w8 I+ a EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);6 {5 u1 _0 d" L# P1 ~4 [+ B% x
4 E1 S: m! G1 d7 ^& N9 F/ S
// 禁用高精度子模块, B$ T' B% s$ j2 K
EHRPWMHRDisable(SOC_EHRPWM_1_REGS); 9 t Z9 r4 ^4 w/ C9 n9 L% V: H# w: c6 s% D# ]
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio); # a( w3 j5 @/ V9 Z, A, `9 Q} 6 B5 ?( {/ R; Z0 \% h( h& j0 J7 @$ Y5 ]4 U1 B
void ChopperWaveform(void) ) |0 w% D6 h5 |+ |3 r9 ?$ f. w$ w{9 _! f% S: \3 B3 v' }
// 50% 占空比 " d0 L+ h$ y# N) N2 r1 n1 v EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);/ [- J: H$ D. [, X/ }9 C7 N; W
// 4 分频* J' ~; _; r1 X$ @* ^
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4); q9 X) H' d' b+ b // 单个脉冲宽度+ @! M) B- ~4 A; J. g" M
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);) _, k/ j8 I1 Q" A4 a1 P' ?
// 使能斩波子模块 6 I" e# n+ A0 D7 E) l EHRPWMChopperEnable(SOC_EHRPWM_1_REGS); 3 Y( c( t4 [# X* v1 {}. i& ~0 p! B: w5 N# `. Y4 E5 j
2 _) o0 E0 K3 A5 N/****************************************************************************/ ' ?7 S+ T) a! f' [/* */ - |4 D2 w V& t. _$ W' r* M/* PWM 中断初始化 */9 {) }( n6 D) K% z0 d
/* */5 l: g7 ]4 f: A3 P/ F
/****************************************************************************/" j M$ m: M5 ~8 Z
void PWMInterruptInit(void)6 ?8 c! B) U: f+ x1 U" M( n
{ 8 n) t& W, j# Q- c1 t. G // 注册中断服务函数 3 I, A) R1 Z" z; _6 I. o IntRegister(SYS_INT_EHRPWM1, PWMEventIsr); 1 f7 K4 a. f: o0 j IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr); + R- P3 {# w( m G2 |! w: J " T+ K0 L! j- g; P8 d& q& j" @6 o // 映射中断 2 N# P+ s, X. k IntChannelSet(SYS_INT_EHRPWM1, 2); - z; r, t7 k9 k; S/ s& y IntChannelSet(SYS_INT_EHRPWM1TZ, 3); $ Z- c. }9 V: w- C0 a3 p y; R4 N" t) r% C: x3 u% p0 H
// 使能中断) y: I& K% P& r5 } b
IntSystemEnable(SYS_INT_EHRPWM1);8 G B8 R$ J/ [: \% a" k [2 R
IntSystemEnable(SYS_INT_EHRPWM1TZ); 2 g! \* D9 O4 E$ G! R$ W1 U} 4 B" T# {9 M) k. A j% i$ z : [; P' X5 R# ` L/****************************************************************************/ ; q; d0 d9 e% E/ J: I& a$ S/* */ ; o4 i* k! z+ _" K" z2 p8 N5 d. A/* ARM 中断初始化 */ ) s% }# C* v# V7 {6 \+ j/* */ 5 P7 j2 I' X O4 q+ |) a! K/****************************************************************************/ 1 u) u2 A* r9 a: \+ r4 `0 Y6 M/ Mvoid InterruptInit(void)/ v3 m5 V$ w3 F6 H' t5 T$ F+ ?
{) K$ Y5 @# c; W; ? @1 L+ L
// 初始化 ARM 中断控制器 ! M% x! \" {0 z& l% | IntAINTCInit(); 2 x: {9 _6 p- U 2 Y/ ~: L% K' m! | // 使能 IRQ(CPSR) ; o' `4 ]( h7 ^3 W& {7 ?+ | IntMasterIRQEnable(); ' W: X) y/ T2 e& L* n ; Q+ J) |6 o C // 使能中断(AINTC GER) 8 y) R8 f# q9 L/ y( x% Z0 C( v- k IntGlobalEnable(); 9 s6 L8 P) r0 ]. \7 S) t$ Z% D8 u* i1 g3 e
// 使能中断(AINTC HIER) , x' N w$ M5 j8 z3 K- o) ~8 N IntIRQEnable(); . d* j+ ^7 w4 @3 C}2 B5 D( X4 H% h! C; J
" l0 {+ T- v4 f) Y& M' z作者: 浙江第一帅 时间: 2018-10-30 17:03
/****************************************************************************/" T7 W7 ]* g3 R; @8 U9 C H8 ~
/* */ {/ r9 P! x5 V( c
/* 中断服务函数 */1 G1 j' [$ i) H0 D& p' ?4 l0 y
/* */ & @ x, {8 G1 e. Q% P8 x9 B/****************************************************************************/ 3 @+ \- i1 A8 c: `* m% v7 gvoid PWMEventIsr(void) $ a0 l+ b' j' G$ q{- K3 N! ?, v+ u4 n& X4 m, B
IntSystemStatusClear(SYS_INT_EHRPWM1);. [7 _1 U! z5 Y0 G5 A
* k! J6 F O) F8 O; F% D% i
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);, \ r' e4 I) r" Z0 P
} : _% k; F0 H3 ?* W: r5 L$ [% ?( m: t5 E* z0 N3 w! X
void PWMTZIsr(void)2 A; n/ j0 c, p) |: c
{8 Z3 s1 C* P) X6 V& O
IntSystemStatusClear(SYS_INT_EHRPWM1TZ); 4 ^' M D6 e" C! `- H& s8 L5 l, Z0 K& {; u+ w
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);9 | F6 U$ d+ _
} # y3 e5 B# F. R# h/ d$ ^9 K8 \ 7 u& O$ T) K2 l( W/****************************************************************************/- N) \% H' n4 q3 Y
/* */$ K& M. g1 ]# J1 ]
/* 初始化捕获模块 */ & K. e8 K k- _* X& B/* */4 M* Q2 J1 }+ B4 m( Z4 r3 P8 r+ p. q
/****************************************************************************/4 z1 }5 |2 e. M3 `1 d3 X4 `
void ECAPInit(void)- l* f1 q+ T' V, s- z$ ~2 m
{ j/ i3 |8 m: \0 v$ e& F4 `9 r
/*-----设置 ECCTL1-----*/ 8 p, J3 d7 E7 {" w- C# h5 Y // 使能CAP寄存器装载( B" \* Q' o! e/ r
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS); 8 X. D) ?2 N# S3 h // 设置预分频值.6 w" v' P9 w" c9 @
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);+ M$ ^1 `4 C6 |$ Z
// 上升沿触发捕获事件4 f9 H# ?; x, l$ s% v
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0); 9 M y8 a+ G5 Z6 b& h+ i- W // 输入捕获后重新装载计数器值.) t; W, Q, n3 b7 a3 O
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);$ ^. d( d; X7 f