嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
/ v. o3 E" d6 _& v
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
1 @* |& m! L# U3 a; g" ]- R3 {* m
/* */
: K+ V$ @1 R) j' {- q2 \
/* 宏定义 */
6 l7 P- C8 O7 T; m4 m. a6 h6 r
/* */
8 A9 {4 \; I3 \0 ~
/****************************************************************************/
- f0 D& ~: A5 a7 s, K
// 软件断点
' W+ ~0 ?. p( @0 f1 t- G! h
#define SW_BREAKPOINT asm(" SWBP 0 ");
# ?2 H% U3 h5 _) A; U; {* A
3 w% Q' F+ ?1 Z$ m D; }
// 时钟分频
7 b/ m5 C0 T7 D7 y
#define CLOCK_DIV_VAL 228
6 a6 ^! `" L( j* ?8 c1 n& {
2 Q0 g3 T8 |: \, Z6 R- g9 Y+ Q, t
/****************************************************************************/
9 l2 s0 V+ T) L- `- u
/* */
& P* A1 Q A' n V6 h
/* 全局变量 */
. l& {4 K; z* ]$ W( u ?! e9 T
/* */
/ `, ?' w& K6 L2 o
/****************************************************************************/
) s) ]% E: f& z3 x
ECAPCONTEXT ECAPResult;
7 f. ?- c7 j6 k# `7 H8 q
5 F3 d- a- [7 ]; ]- K
/****************************************************************************/
$ ^$ R$ ]5 ?/ V7 E$ R
/* */
, P1 D8 P3 ^& C f ?& a
/* 函数声明 */
7 \& ^5 @$ A$ k; G
/* */
. D f0 x% g F! z# G* z+ m) G
/****************************************************************************/
* @+ Q$ _4 \- \3 `
// 外设使能配置
- T8 ]# e7 V; X. l6 {- n1 @
void PSCInit(void);
6 b+ E. M- q% Q
7 x' w9 D7 D, d% i& G: g
// GPIO 管脚复用配置
, N2 z- r7 j5 o
void GPIOBankPinMuxSet();
' ~6 ]' p% ]4 v$ l# `0 N5 y- f
0 W' t1 g- A4 w/ ]2 t2 I5 R
// 产生波形
5 g8 D c" y( o- [& W; z
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
7 S y( C8 t3 F9 V& `
void ChopperWaveform(void);
( N9 l4 i m2 W/ v7 Q4 _: ]/ E0 A7 `
0 t0 c2 o2 d9 I2 u
// ECAP初始化和读函数
3 n- w( x" l+ |# P
void ECAPInit(void);
9 A( s7 e4 ?- U6 K( L4 I8 `1 y
unsigned int ECAPRead(void);
2 z% {. j" ?6 q% N) q9 N1 ?
# ~8 v) T f( ]
//ARM 中断初始化
- {- H; c0 b2 X" ^$ P4 l+ O9 {- ^
void InterruptInit(void);
- C+ B) T" T* ~; ]) n1 Z. q6 L9 W5 G
6 _% P7 V3 f x
// PWM 中断初始化
. q# _8 S( t/ Z
void PWMInterruptInit(void);
( |+ r4 F: K* Q- f- j7 U# X: ~" M
// 中断服务函数
8 _3 D5 k+ C; [2 d
// PWM 事件
& \- |6 ^* z/ Q3 F9 L1 t K
void PWMEventIsr(void);
8 c$ A( c8 q- g
// PWM 错误控制事件
) x& i" O) ?) i: y* m3 k! P) z' }
void PWMTZIsr(void);
0 |" b S0 m8 T8 u$ |; `/ Y" _
6 O- z$ P" }) h6 T0 @3 L) O+ k
/****************************************************************************/
5 c& s/ `, k& r, F. \: P
/* */
! E# F) w0 ]2 {5 `5 M: B" [& j' F1 i
/* 主函数 */
0 Q0 \: O9 w! m# e0 |+ t8 X9 q2 V/ U
/* */
/ F6 @6 |+ l( Y3 @6 W) `
/****************************************************************************/
7 \! d( w1 [( F& ]% i; ^
int main(void)
/ n( m5 ?6 A: V n6 e* i
{
- T! l6 C- F1 f3 y8 [, W. v
// 外设使能配置
1 _' n2 M/ o" y4 q$ H0 w
PSCInit();
3 s/ t f& w0 \6 \5 i3 P Q
% {# L4 L; {2 g% O% @
// 初始化串口终端 使用串口2
0 F/ ? a4 N8 E; X9 L3 a ]/ S$ z+ s7 c
UARTStdioInit();
2 R: C6 V4 E& k2 k
0 d# }3 L6 m$ n- z; V$ B/ i% k9 x. Y
// GPIO 管脚复用配置
) P& ^$ ] j/ @
GPIOBankPinMuxSet();
+ w( j* s, t3 s e, @, O: Q( X
" e# }, n1 q2 |9 g5 ?% p
// ARM 中断初始化
( S" v( I0 a! f: h
InterruptInit();
* x& L$ A: i' U2 ~
& m+ g; q" d. C8 ]& m0 [0 b; h
// PWM 中断初始化
$ i: Q6 _3 Y0 y: q: l# D3 |
PWMInterruptInit();
4 {3 j; r/ s* j. U' D6 @, O
. v* ?( i& X& U1 S7 ?$ U9 C+ C
unsigned char i;
* F" E' W$ P$ |5 l: M
unsigned int j;
+ P; q) P2 n; p' o; e# z
+ ~- F' g3 W5 F4 ?! s' }4 l8 p
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
( P. f: b. U; f7 h! n" }
UARTPuts("------------------------------------------------------------\r\n", -1);
- F+ b, S, ~( S1 s( I% |9 W/ q# f) ] X* X6 x
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
5 A. z" |$ ?) {3 J/ H
// 产生波形
1 v% ^7 S6 C6 ]2 M- ^8 w
PWM1ABasic(25000,50);
; ~( l0 r; N, e
7 K! I8 r; o4 R
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
7 `2 o$ r+ r7 E5 [( v D& D
UARTPuts("------------------------------------------------------------\r\n", -1);
: v& K/ C' A. b. M+ V
% K x, l; E' D4 Q% }$ }
8 R6 Y/ Q; p8 { X. z
% i. Q/ l# `% k8 s
UARTPuts("------------------------------------------------------------\r\n", -1);
' x' b f! h# K$ W: Y# B
UARTPuts(" C6748 ECAP Test\r\n", -1);
5 Y4 w3 P( I( |# [
// ECAP 捕获初始化
+ C" P" |+ U2 P0 ]9 I( m4 S
ECAPInit();
0 G H% M% S& n6 F* C
UARTPuts("Initialize ECAP.......\r\n",-1);
. h3 W7 b; z" a7 E! p
for(i=0;i<5;i++)
1 g# q0 T2 I! e) }# e* U1 F0 q& S
{
* }# ]9 B" Z- y3 D2 J8 v$ d! A
for(j=0x00FFFFFF;j>0;j--); // 延时
9 C' a1 x& Z( B
ECAPRead();
$ l1 ~5 ~% e4 e" v, C1 t, i* k% E
}
4 V" B5 l) Q- ^! y# b7 E
UARTPuts("\r\n",-1);
, d$ y3 ^7 n% H5 s2 L
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
( f: m% F1 R2 Y4 a8 R: S
UARTPuts("------------------------------------------------------------\r\n", -1);
* M, n; O2 h, S3 K6 J* L* |
, { y; I( X& s% l8 R: { v
// 主循环
: A, ~! N; a! c. r# i6 q* X
for(;;)
% |( }1 ^. A2 T- T3 @ n. h5 t
{
/ i. O, d! n5 Y& @9 N1 [8 [
& j: \( @( P7 v1 a# e% J
}
2 u; H ^: i7 V; M2 ?- N
}
4 S7 I" p1 d8 L; m
! _& H" e- b' }
/****************************************************************************/
- k3 W+ i, n9 ?7 k1 b6 s
/* */
, N& P0 W( W4 G2 I+ p2 \
/* PSC 初始化 */
) d2 w) T* `$ U. |) t/ y' f. P
/* */
9 K5 C5 j9 C; |5 F0 t0 c. w+ `4 W
/****************************************************************************/
: U" F( h. B7 Q. J) c& S
void PSCInit(void)
! E* j8 L' j0 j1 ]
{
( I9 J1 X) s e$ J. B6 i
// 使能 EHRPWM 和 ECAP 模块
Z( q& R& Y1 o# ^0 L. N
// 对相应外设模块的使能也可以在 BootLoader 中完成
' n3 P! D8 \# ~
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
6 R r4 ^) `9 @$ I* C
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
- c% l) g3 {) U% E. N
}
" ~. e6 R" e$ Z* H8 F) f
5 K$ ]) z# b& C6 V' @& Z
/****************************************************************************/
" k, t! O; |% D9 `8 n! t
/* */
' l* u4 h3 T% h) D2 d
/* GPIO 管脚复用配置 */
/ v7 E6 Y' e4 ?- F+ V
/* */
# U/ y" J* h3 a
/****************************************************************************/
" }2 U- P6 H0 u5 W) _* k2 D
void GPIOBankPinMuxSet(void)
+ w, {" F/ I) W+ e5 H2 T$ b1 O
{
: D* a+ c! o1 k0 d/ o; ^! \7 y' I
EHRPWM1PinMuxSetup();
1 R4 n; p, Q9 n2 ?6 Y3 Y T; v) _: Q
+ M5 X0 K! L) V) V* n4 |) O
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 {6 {2 R8 d0 b. u* P
// 作为捕获功能时管脚方向为输入
1 l' _3 T" T; H+ v7 ]' K( B+ \3 ?) l
// 作为辅助脉宽调制时管脚方向为输出
) D( J/ R5 d. o7 g8 X- _- } n# K
// ECAP2 / APWM2
5 ^- z7 F* n% u: M1 z3 q; D3 |
ECAPPinMuxSetup(2);
0 t& O% R7 T9 @( r; I3 D
) \1 ^" N: e/ c1 V) E- C
// ECAP2 / APWM2方向设置为输入
' `1 Q% \$ s7 o- L2 C H, i
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
. O. H& F$ v) {; y
}
9 m4 |' f, w7 B
1 k6 z1 r% l q4 n
/****************************************************************************/
+ g0 f. ~- m' @* l$ q; a3 ^
/* */
8 d7 d9 E; C2 D3 S! h* f+ g
/* PWM 输出波形 */
7 ^, z3 O8 @& ]+ v7 y
/* */
/ ~1 ~4 ?5 ]* w l: g
/****************************************************************************/
. q7 m/ N$ o# `8 }
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
+ o0 e R6 z& d/ U
{
! V* f, w* @0 v) e$ C7 i
// 时间基准配置
) I: A# q4 t4 m [" ?/ Z8 f4 Y, A
// 时钟配置
# h# h* m- c, X! l i1 A( q
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
8 C, d6 w/ |. C
7 k2 H$ R& M) p
// 配置周期
/ }- E- D' P" l$ v
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
' s1 r: M9 L$ b6 A: b9 [0 }/ }+ E/ B
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
) X: q; d0 Q5 P6 O$ |& h
/ t; w# j; i. X& {
// 禁用输入同步信号
- _* S/ x+ C6 d# r f% `
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
8 x/ W7 J& f+ u! L" T( A
4 a2 y1 b& a/ S# R! X
// 禁用输出同步信号
( K% U% b# v: s$ N1 n7 B8 t/ i
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
, k8 r* o' f5 G# o$ B
5 O$ c- n* ]+ b- U+ ^% i
// 仿真(DEBUG)模式行为配置
/ r n9 W: C; n6 ~* E
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
! F7 Y( H. @, L f+ s; Y
% w$ X, |4 i% G l0 m- \0 u8 B; [
// 配置计数比较器子模块
8 i. ~, U; j( ^5 E3 f, M2 ^
// 加载比较器 A 值
" ]6 y6 W! j0 X# l' Z
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
. \% k: L+ W' E, L
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
2 G0 T! M: ^ `' q( c
& a, X5 Q4 Q9 N7 F
// 加载比较器 B 值
/ ~& C5 a. y( S/ R
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
2 p w( N8 M. L! |
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
) Q; E& F; F. H1 R8 e
! C* p" \1 x" f. H: n
// 功能限定配置(输出引脚触发方式设定)
7 I( D6 D( k2 I
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
, r0 I/ D* L$ g' }; W, l- u
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
: Z5 o( e) U1 Q- I: D' G) D& K3 o ?2 |
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
: e! K5 N' i' @- r! g
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
. z5 H$ m8 N0 ], G! ?
/ P9 k9 b1 S- E$ N
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
& u( F5 O z: {
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
$ |# |- T. s4 l5 y O
+ o1 h3 q( i0 \9 F
// 禁用斩波子模块
/ H4 I2 F, a' s, o5 L$ v
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
8 U' M% b: V* I/ D9 V" F$ [
: x4 L$ H V) r( w6 Q7 y: ]4 m0 g
// 禁用错误控制事件
8 I& `( f7 x9 B: M, y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
: p7 F4 I2 d: r8 s/ y
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
8 T! V4 C0 b* E
$ q1 d8 Q8 ]+ W+ W6 T
// 事件触发配置
+ W4 E9 ^' c* W4 x- n
// 每三次事件发生产生中断
7 c$ l: K( [: |7 I; J
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
0 |' g4 x1 G. `- e
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 | W" }: A% x7 `$ n/ k0 {5 e
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
; g6 S# _0 v6 t5 x4 _7 o) e
// 使能中断
3 Z! f$ G% x2 C! m3 k# M
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
' B! f/ y! v1 r( T, `
* F8 N7 L" f& F( n6 j# d( r" _3 ?# o
// 禁用高精度子模块
+ t' A+ C, N1 T
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
& D2 d5 N% ]% B3 `
5 U$ J6 l d6 q4 a6 g
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
w% x6 Y9 V( `/ b, s# T9 R8 I
}
3 j; E) p6 b; }5 v( ` Q
( M7 p0 _ ]6 ~7 W1 D
void ChopperWaveform(void)
+ j5 T0 ^2 w* n5 Q. E& F
{
: V# K+ z- e$ b% M: M$ k
// 50% 占空比
6 L5 o ~* f5 x! o; P% i: Q9 ^
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
; B, b3 X7 _/ n6 a4 G" c
// 4 分频
a5 e4 I5 k" `. Z" V( Z/ o0 V, T
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
- E/ r* D/ R1 Z# M5 `8 @- R
// 单个脉冲宽度
7 k% s" T) ~% Z4 L$ v% ~3 k
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
9 R1 A$ v7 l+ P" n& {
// 使能斩波子模块
# P* x. J$ Z }! C: s; ?
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
% j0 t% d- r; R3 J3 S: r
}
3 h- x; {/ a6 A1 k: Z
3 x# X( d& N- ^. |3 J; [) a) r6 U! R
/****************************************************************************/
m% ^* H) m% z( a( F. c6 q$ j
/* */
; A2 o: c' v3 b8 q2 a
/* PWM 中断初始化 */
- ~7 `/ S8 R& }+ M
/* */
) h0 ?, j' p& Z# ~. d- b; @
/****************************************************************************/
* R8 a, X( P9 l4 U/ i
void PWMInterruptInit(void)
" P- |: O/ A; S. c: a
{
: I" d" v% k, m6 Z
// 注册中断服务函数
: i I/ v' n7 M3 r2 g- |& ^
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
- `6 R0 {1 D3 T7 q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
- u/ M; I8 @6 y1 M6 o) u. @1 r
/ E, z, \# r) A* O3 q- E" p
// 映射中断
1 l# N2 R( n( } I) i% e% {4 l
IntChannelSet(SYS_INT_EHRPWM1, 2);
~& S: n8 h) p7 b
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
0 B( I% |; ~0 y) Z
/ z0 @7 D7 X# u, J# [6 A- G
// 使能中断
; j" \) M! V+ }8 j
IntSystemEnable(SYS_INT_EHRPWM1);
0 T& M* C7 B G" E9 W( m+ z
IntSystemEnable(SYS_INT_EHRPWM1TZ);
2 T% n3 S/ \: b5 l2 g5 s
}
9 Z% ^2 U5 a: x. v
" t5 e) N/ j8 k3 m+ {1 B) T0 s+ a
/****************************************************************************/
6 T& A1 [$ h" d; O# I1 z) v: a: d- @
/* */
9 b" N, N/ {( k; `
/* ARM 中断初始化 */
# H, d7 t, f4 ]3 T# s, r
/* */
% [/ a7 _$ d# c9 w0 i# A8 w2 {
/****************************************************************************/
% [7 ?6 u% B5 n4 w7 K9 c, }
void InterruptInit(void)
* i. w9 i d* R5 p1 Q6 V
{
; T' R* Z( J- d5 p
// 初始化 ARM 中断控制器
6 W5 M' H. @5 p& O: Z
IntAINTCInit();
- ], M, c, z# g! F i3 \* b0 |5 t
6 s& u0 U @' r+ X# T# h
// 使能 IRQ(CPSR)
5 A, u2 W! |/ l* B- G2 w
IntMasterIRQEnable();
8 W2 s( ~. I+ D- s% D1 } p
$ c( B& @. }1 Q* i7 b/ r
// 使能中断(AINTC GER)
' Y8 \0 |" e2 P9 h0 z
IntGlobalEnable();
5 U C2 J4 f- f# q4 v
* F2 L' l& a- S" c' h: E
// 使能中断(AINTC HIER)
8 ]/ t6 p/ i8 {; M$ K
IntIRQEnable();
/ W ^" q5 P) n. e
}
# ~1 i0 d( @, i
4 ~1 j4 D8 j4 `, N+ Y# g
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
$ q0 t& ?9 X, m. I
/* */
$ Q& M* c) U' F0 s' T6 J
/* 中断服务函数 */
) ~) E. P4 b2 H
/* */
3 x$ h6 T" b6 o( q+ z6 m! b2 v
/****************************************************************************/
& d0 x% [! R% G$ t* R
void PWMEventIsr(void)
* s4 J6 `$ R) O2 ~* u
{
% ^! d4 k. g: @) o
IntSystemStatusClear(SYS_INT_EHRPWM1);
! G. E- K D6 N) `# [6 o8 z
0 M/ c2 T; ^# W8 N
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
& H8 y( C8 M0 A; a% p, r. P
}
3 g) B* S1 K4 |0 N& S
& Z7 ]' ?7 ^4 |8 A1 X
void PWMTZIsr(void)
5 ?- d$ @' D6 |0 N4 g, }" Q. H
{
4 [% Y4 I3 |3 g- }. ~+ y" X" _& z
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
* `* b+ T+ F' _) O) ?
6 K/ ]0 K# m+ c2 D% u
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
/ b$ f' p2 C+ Z5 R
}
" o! T& T9 S8 Y+ g
' s5 w6 I' t- F+ N; @$ K
/****************************************************************************/
6 C- g4 J `% X
/* */
! H7 G* i$ N$ |) ^7 g
/* 初始化捕获模块 */
4 W" M" Y/ v- P0 R9 `1 e* W
/* */
6 p# n2 I+ {$ v- @$ Z
/****************************************************************************/
" d: c3 w0 S2 w6 J5 h* |
void ECAPInit(void)
1 e$ Q* V7 T) _# {- F0 Z8 W
{
2 J6 [9 L* G& g- x& G* l; E
/*-----设置 ECCTL1-----*/
$ ~. V5 e9 m5 p3 f+ e- c( w _+ Z
// 使能CAP寄存器装载
9 L* z/ r: {6 ]" D4 k
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
6 d! R. f/ N" g8 a
// 设置预分频值.
5 v' }4 V A5 o5 q
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
; ^) c c" i: P% H x- T7 e1 s. W x9 [
// 上升沿触发捕获事件
; c7 M% u0 o' T6 Y9 [
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
& G- r: ]( ]* `5 Z, A
// 输入捕获后重新装载计数器值.
9 X" }8 C# v* F/ n
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
5 A, t8 d8 Y; t4 T2 ` R. \
4 q' A$ r( S8 F5 `1 R
/*-----设置 ECCTL2-----*/
( {% ~; e' C3 w. o4 ^" G# A5 q+ H
// 连续模式
# G3 w& c! u) U8 N; k' A
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
e1 ^* k9 m$ l) X* }7 k; Z5 O
// ECAP计数器TSCTR持续计数
3 F8 w# V0 p1 z6 J7 H1 v! ]' p' ^
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
; f4 {: v: ?" D2 j6 H
// 禁用同步输出和同步输入
" O! c6 y, }7 b) g
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
8 w! c2 @; l2 Q. R3 ^; z2 n$ k
// 配置 ECAP 2 为 CAPTURE 模式
! U& I0 w( }9 I
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
! J9 M( U% [/ F1 m( p2 K
+ S9 ]+ j" }5 }5 p6 R; ?! t
// 使能中断
. i( E+ y' o+ R) u# Q; G0 I- o" z
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
# W1 b' o/ x: r# B
}
+ D0 }4 O/ w3 e. ~* P* A: ~+ E# P
. g0 j8 T% u& B
/****************************************************************************/
8 F$ h7 c8 @) C/ |+ Y
/* */
: S x# U1 C9 j5 a
/* 取得捕获结果 */
, O; q8 K# B* \0 ]# M
/* */
6 e I5 t- x i7 s8 e2 p
/****************************************************************************/
( k/ R. e% Z; Y$ G
unsigned int ECAPRead(void)
6 Q# P% C6 d: |$ e0 H& A/ _
{
5 J' D8 m' R; J* i: Z! n
unsigned int capvalue;
+ t$ O0 i2 M1 u( [; ~
unsigned long frequency;
# h7 @8 h9 {9 {" U+ i3 W
4 v L$ g+ Q; U2 X# {% K
// Event1 中断标志
Y+ Z! X- P4 `* ]2 H1 g- k
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
) @& R, E( X6 G9 p
{
/ J' G' v! H4 {; t, N$ S% ^2 d
// 取得捕获计数
7 X* j" O N6 x4 }
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
4 C% X+ _6 R( Y" a$ r
capvalue = ECAPResult.cap1;
* r& c' i" e( Q
. B! |4 i: T3 K) L
// CAPTRUE 模块 228M 时钟主频
9 L3 G ^4 \$ o7 M0 y% h
frequency = 228000000/capvalue;
1 U5 |- ~9 A( c6 ]' t1 S- ], z
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
" a l. P9 J& }4 o2 B, U
! j# j) _) `0 c2 s/ E
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
+ {' m) ?* C9 P4 R. i
// IntEventClear(SYS_INT_ECAP2);
+ y) _8 {$ n* M9 u; |
}
- U# m* x( N' W1 }' t
return frequency;
- p9 S m6 S0 o6 V9 X3 d
}
+ W$ D+ W. t; k+ h
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
% m; s% \2 B% R h% Y3 z$ p
[attach]4202[/attach]
作者:
浙江第一帅
时间:
2018-11-1 21:27
可以给我发一份吗
作者:
广州创龙莫工
时间:
2018-11-2 08:51
如需获取相关资料,请发送您的客户信息到我们的技术支持邮箱:
support@tronlong.com
,我们会给您提供相关的网盘链接。
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4