嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
1 L: v3 q% g5 l, T K3 L+ _
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
: p% y, d* w6 j. @ F; B
/* */
$ x( r# V* M0 B& D4 V
/* 宏定义 */
# N% F# o: q- f9 }/ ~) d
/* */
+ O$ w" U/ s; [6 E8 V7 R
/****************************************************************************/
7 M; Y% m; C# U
// 软件断点
6 m* a4 r- j& t7 O/ O. J8 U4 f
#define SW_BREAKPOINT asm(" SWBP 0 ");
! P/ Y( ?$ B- a
7 D6 G1 Z" t( P) H
// 时钟分频
, ?) b7 {' O1 p& m: H" D3 I
#define CLOCK_DIV_VAL 228
' \- \0 R0 \7 J2 {5 b6 v/ o
8 c7 w% ~3 a: b# S3 G/ Z
/****************************************************************************/
* u. E5 d' B/ E3 O6 p. f
/* */
" t- {, X5 T/ V
/* 全局变量 */
: [: D- Z. r$ d2 k9 }+ M# t7 K
/* */
1 p2 D6 v( X5 J
/****************************************************************************/
: J3 K# Q' X" r
ECAPCONTEXT ECAPResult;
8 k* e$ k! l% R+ J5 U
! u7 V9 X/ h, F) e; C8 t. ]1 Z, Z
/****************************************************************************/
4 u; ^. |4 h7 w1 x; h2 R2 H
/* */
" \6 H/ V2 U3 i, H4 l' v
/* 函数声明 */
7 {8 e) }& a; t3 u
/* */
}4 m* h. I& S) s
/****************************************************************************/
D; q# @( W: e0 z% _8 Q
// 外设使能配置
. e2 I. E. {1 z6 ^7 I
void PSCInit(void);
4 G, I6 _6 |8 w5 ~+ c( O0 S; @6 {
5 Y' E6 i: p q- `! B- H7 H- w
// GPIO 管脚复用配置
6 @1 P3 _6 y2 ~8 N! }6 }
void GPIOBankPinMuxSet();
' I; g; h5 w9 Z# e5 S
; e+ v9 P0 x1 b; Y0 ?
// 产生波形
$ |4 A. m1 b) V ^0 b
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
j5 w; B$ g& I, C2 T
void ChopperWaveform(void);
' Q' @$ a, m7 i" m' `
% L+ D5 q3 F; f9 H% z- i2 ]
// ECAP初始化和读函数
# E% [, m9 Q7 t# @1 K8 [
void ECAPInit(void);
( i# ~! l2 K: u
unsigned int ECAPRead(void);
# W, t/ u$ L, ?
% O$ |. e9 r" k' I, p8 _
//ARM 中断初始化
& d, P+ M, ^ |% f* H
void InterruptInit(void);
! M2 S. b. m `8 D. ~* h
5 q" F5 E3 D' W) {$ x5 B6 E2 T5 _
// PWM 中断初始化
) n0 P7 {$ m) i' A! o, \
void PWMInterruptInit(void);
. a2 H% M" a! V
// 中断服务函数
! ?* ?) h& }! Z( w2 f
// PWM 事件
O# d5 k3 h, ~; P8 j$ Y" _8 Z2 ]
void PWMEventIsr(void);
/ ~+ m7 ^% S. D6 K8 h3 T$ z
// PWM 错误控制事件
! A9 O7 N4 r, N$ h1 I. ^7 x: z
void PWMTZIsr(void);
- W5 {% _2 v6 A9 d o& V- K0 n4 ]
; C$ I1 J2 d7 |. x) d$ t
/****************************************************************************/
. l' A: \2 G. O# T& K( V9 c
/* */
& {! P3 M' A- {. v0 p: M
/* 主函数 */
$ s$ P$ ?4 y R- |9 |* {
/* */
0 w6 b n; {6 ?0 A7 E$ p6 F& p
/****************************************************************************/
- v, G2 r- y1 y2 n
int main(void)
% w* q5 h7 Y' @2 I( j! ?
{
5 i1 N2 B- f( _+ I- S+ G/ r4 N
// 外设使能配置
* A5 {% D8 R# `8 J0 x
PSCInit();
, _5 _8 K5 y" \/ d+ J M7 [
/ e0 G" M% I0 A) R
// 初始化串口终端 使用串口2
( a. y) s; m" q7 b: L: |
UARTStdioInit();
& ~0 x8 U0 ^- L: P W
! w* Z2 o2 m( S& E3 p% G, w' n
// GPIO 管脚复用配置
Q- i* h, {# E0 n6 d( F Q
GPIOBankPinMuxSet();
5 l) d- S; [: k' h' B0 S( w' g3 C
/ M' M) x' y# O3 g+ a6 O
// ARM 中断初始化
9 Z7 U# x8 ?5 B( h
InterruptInit();
. z+ u" P9 x; y0 W: D
# n& c! n, J0 p: n
// PWM 中断初始化
7 i1 h0 H% d6 p& o+ W; j
PWMInterruptInit();
) j, D U. j. m0 A" [
- f2 \" O7 C" A* n, J7 R4 ~1 {
unsigned char i;
5 K4 \5 z% n- U& h5 U" Z) H% O, f
unsigned int j;
! _+ E5 S+ t8 [% X3 K# @2 V
$ ~" @% Q8 p7 v8 d* H9 a1 m
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
2 g- C# }: x: @7 K! ^7 f
UARTPuts("------------------------------------------------------------\r\n", -1);
|: a" \3 J) o# [' y$ p! U
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
& O. z: L4 w* \. D' s' V$ I
// 产生波形
1 t7 h+ r- P: F# i3 F
PWM1ABasic(25000,50);
3 f+ o. L' a9 U! k U
% H! J+ L* C9 _; B7 q9 v
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 {% v2 ^/ c, w
UARTPuts("------------------------------------------------------------\r\n", -1);
" A9 B. @- ^$ C. {( b2 }
$ m: c; D) p" y9 n% h5 z
8 x0 K) Y( X) C9 J) z6 v
6 m: e' e; m# T7 ?* d! O
UARTPuts("------------------------------------------------------------\r\n", -1);
) y4 Z2 A/ O5 I" y( [8 Y
UARTPuts(" C6748 ECAP Test\r\n", -1);
2 X2 t" _" J) Y4 @
// ECAP 捕获初始化
. i/ D0 @* `; Y8 s7 S! k2 y
ECAPInit();
7 X( J; X% ]9 {2 A
UARTPuts("Initialize ECAP.......\r\n",-1);
, n. u& b) a6 e$ r6 c$ P1 D0 o5 U6 Q
for(i=0;i<5;i++)
* m" i/ \1 G: `0 x
{
% J, s$ z) r6 ^; Q/ e( ]& m
for(j=0x00FFFFFF;j>0;j--); // 延时
# T! D6 k& T4 c! a
ECAPRead();
, S- O6 s% m. d$ D1 D6 y
}
6 p: `" q4 b$ k# |* E- j3 h$ s
UARTPuts("\r\n",-1);
* q6 ?# X& {2 I0 M" M
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
! h2 {! Z5 x D) G, `2 `" |
UARTPuts("------------------------------------------------------------\r\n", -1);
- ?4 U7 q8 `5 a$ m% a0 Z
( V' l) J L) g$ Q
// 主循环
* y* s, X8 D, Y! N2 N; Q- W$ ?- A
for(;;)
& j0 S( ]; P& b* A2 h* i$ R
{
T5 G% j- P. `
. n" R4 r; [! Z+ u, `7 b
}
( U5 N/ F' a5 j% l ]% ^2 ^7 F
}
$ |) H f6 w0 |) V( S- z N
8 G' h J5 D' K& M+ n7 l0 K* W* v0 I
/****************************************************************************/
- j* q/ \; l9 t& W I
/* */
+ e: ^! _% E* l* |) X
/* PSC 初始化 */
' J9 c, w0 f- s" j4 X2 j' t
/* */
$ x, v$ m6 p9 N- W- L! J# a4 G
/****************************************************************************/
, ?) h" `) K6 N/ Q$ s Y! j% a
void PSCInit(void)
; o( d6 U/ ?. F1 k* h- I9 p
{
0 m! Y0 P6 M. ]7 g
// 使能 EHRPWM 和 ECAP 模块
4 H5 R& m* o0 C6 a* C
// 对相应外设模块的使能也可以在 BootLoader 中完成
% _3 D$ B- _) V; {7 H' R/ F, n
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 ~- t* E4 A d, k$ Z! O2 g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
4 p0 B0 v/ ]0 H5 I k
}
" N1 A2 V' t# d6 H4 s' V7 F
9 ]/ W5 E- N8 F
/****************************************************************************/
0 \' A1 N r. \, I! b8 d9 k
/* */
. o, z! b g1 I" S0 p
/* GPIO 管脚复用配置 */
4 P' v# K" V; `0 V/ _
/* */
9 q$ P4 E, t- ]5 R
/****************************************************************************/
O/ u$ {9 S4 o2 j: q* {9 v
void GPIOBankPinMuxSet(void)
6 k: J0 A- C$ ^- }) {9 Z# X
{
+ j, e+ |' {, j; j! U8 y3 P {
EHRPWM1PinMuxSetup();
y3 l( T9 j0 |8 P$ w
: i! P, i8 C+ [6 v
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
1 s1 R: A7 U C4 V4 D
// 作为捕获功能时管脚方向为输入
- e3 G. U. U& M0 N, U/ C: }
// 作为辅助脉宽调制时管脚方向为输出
4 ]4 o T+ C) z) G
// ECAP2 / APWM2
Q! k6 _2 W# w/ S& F* u
ECAPPinMuxSetup(2);
0 E, h7 L) i4 Y5 m# s
% c) j* ^6 q6 c8 k7 K9 @
// ECAP2 / APWM2方向设置为输入
9 f$ C9 q) A3 P
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
( z& X( C/ {9 ]5 o
}
0 f1 P( I/ M0 G1 H9 M! f4 P* r
* H- z4 |" l( M% B2 S
/****************************************************************************/
( X* w: U% G0 Z5 [7 k/ T& F
/* */
/ o- `% Y& Y6 c R' p* c
/* PWM 输出波形 */
& x6 o8 m$ u6 b" ^$ p
/* */
3 M) r0 g6 H. S0 f i
/****************************************************************************/
7 i* I' y; ~$ E; O1 R0 R
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
1 ~5 |9 I4 R4 G9 n
{
; m8 D( l7 N0 b
// 时间基准配置
2 @/ b/ i3 L8 ^. O
// 时钟配置
) A: F- |7 ?- o3 G! T
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
4 s+ W# ^( K. ]! Z" Q6 W
6 b, T& t; j Q z1 d; y+ `
// 配置周期
3 A' I2 m& p9 z# p: X( U
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
8 A5 r3 C& j% \5 E
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
" i+ V/ Z: S# G8 m
. v$ ]4 B! i# w% [- q" [6 H
// 禁用输入同步信号
- E; ?" ~: N$ t& t) E
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
2 W6 t/ `2 ?" p$ w0 v6 U- X
& h* F8 Z1 I1 S9 D$ E% ]# O5 i
// 禁用输出同步信号
4 X$ m- ?* N2 \2 b$ H) j
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
$ |4 O$ |2 t: q9 ^" E7 ]+ K+ R: E
% p5 X9 o) ? c8 [0 p- S/ y
// 仿真(DEBUG)模式行为配置
/ P2 c' U _4 \! P; L
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
6 S9 t$ m" C8 C/ N, I
# X( A* g; w5 e9 V
// 配置计数比较器子模块
* w. T- M% w5 i% U4 K/ f
// 加载比较器 A 值
$ ^2 E1 b) S' h# v6 k! ?
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
1 C2 J8 y, K, y: J6 i
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
# V3 N8 b1 u( r
, \) d$ F9 w) Y6 t5 d/ W
// 加载比较器 B 值
; b8 C1 e( |9 g2 ~3 j/ h! v
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
+ ]: ?; _, n" P' O8 M( O
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
5 c. Q' z p2 b$ e Q* q% ]
. t) @" `* s( D/ S
// 功能限定配置(输出引脚触发方式设定)
! {3 A2 F$ J9 h+ Z) Y& l; a
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
# b5 V/ H9 O' W
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
/ [; e/ V8 k& f; J; b
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
3 a9 u! `- v+ P( B2 t& g# p
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
; }" F# {% i/ W8 R
, W. f. e! \8 A: S" n
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
: _3 G+ [- a9 J+ B* X
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
" H. G/ t& `2 k( `
% h1 a% V* k; c5 a" U' p
// 禁用斩波子模块
# O1 ?8 O- _0 n: I
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
+ w0 z$ O( Y3 S; U1 J
& }; \( q9 a( i' c1 l9 e
// 禁用错误控制事件
" L4 X/ s2 Q$ _! Q1 v; T
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
. n2 T% ^; k' n+ h8 H( s
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
6 o* O: X0 v+ a. o" T
" n; g7 O8 c' u
// 事件触发配置
$ s1 O4 I5 @( Z& c' S+ M
// 每三次事件发生产生中断
8 h6 W! o. y5 p( `% S% |7 V
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
% U: }2 T* Z% G+ `+ D3 i! A
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
4 x+ V$ c% K. u9 E' |
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
% W( I$ c5 I; X$ S' _
// 使能中断
p+ x, B% B7 r' e$ {6 ~' O U# O
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
" ]# Q& `) s/ K( b' @4 g
8 ~0 h- V! _! H7 S9 D
// 禁用高精度子模块
: W3 B! i" X( B( ~/ @: P8 j9 A
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
+ h0 }1 V* P1 p
# i* f ^1 U4 Y: I# [# e
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
6 T) A$ [, q* m- {) _0 x: ~
}
% q; _7 i$ Q9 c' T: ^
. b$ f# [* K( j& G/ c8 t/ p d
void ChopperWaveform(void)
& _- ~* o: e$ S ]4 Y2 w# k. m
{
/ Z9 t3 e; k8 l
// 50% 占空比
# [$ O, H: w. m9 m* e, i) T& D
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
, W& G8 x2 M8 h2 g% `1 I# W
// 4 分频
# B, Y4 J* J4 g4 C! V
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
3 @0 }# V8 y8 j3 \+ m& \1 w
// 单个脉冲宽度
' q9 ^% C; t p( A1 h0 `) T
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
- t: Q' E( Q/ D4 [: V# n
// 使能斩波子模块
/ F4 E" h; j' l
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
9 E. j M) Y: i
}
6 }' |1 ?* O, Q, P$ `
" e& e" _' X6 ^
/****************************************************************************/
" x% s0 s, m. j
/* */
* }5 p' C8 N5 {* {( x) P7 b
/* PWM 中断初始化 */
, n1 z. i, m- w) j
/* */
$ e% b$ p9 |- F& J) n$ |; u Y
/****************************************************************************/
; J- U$ m/ l: U8 _1 e
void PWMInterruptInit(void)
) u* K& z2 B% v
{
; c* i+ b+ s/ |% C+ \
// 注册中断服务函数
$ N" |. J t6 F3 ?3 K. L, g
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
) c. [0 X' o. }; N
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
/ ?+ d% o5 B) T
: N% m `1 h# i d: P4 j( C1 `) j
// 映射中断
$ X J) g n9 W {3 v& Q0 T# i4 }3 b
IntChannelSet(SYS_INT_EHRPWM1, 2);
. E2 }+ X! B, R8 c9 b- M0 D, M T
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
% G" J' I. d e8 D8 R1 Z+ f. \
! O1 f) Z; k, _7 ~) s- U0 h
// 使能中断
4 a/ I$ ]8 N# Q0 [
IntSystemEnable(SYS_INT_EHRPWM1);
3 y; T' w: \: a$ U9 e9 \8 f+ q
IntSystemEnable(SYS_INT_EHRPWM1TZ);
' e1 e) H& p4 J F
}
* N9 N0 g5 O0 c1 N2 \
V$ V- Q, h$ J
/****************************************************************************/
1 E. E! R( C) @8 @8 @5 ]
/* */
* q# g: u2 K* C: \8 B t
/* ARM 中断初始化 */
: W7 A0 W6 ]2 H# O e7 p9 g
/* */
; q U6 q2 D/ i8 K
/****************************************************************************/
+ Z3 ^6 r9 m6 ]$ b$ b
void InterruptInit(void)
1 F9 X4 A* W7 ?! m& S2 u4 U
{
! Z2 Q/ v3 M* t( ^' l! d$ ~
// 初始化 ARM 中断控制器
: A+ ?/ O3 F$ ]3 d8 W" P
IntAINTCInit();
& {4 a0 |4 h$ @! c: `' `; ^
8 V& C; T. C" H6 c4 H o
// 使能 IRQ(CPSR)
" ^, _" q0 x G0 e z
IntMasterIRQEnable();
/ X* X, H, V, v% Y0 j
1 M6 A2 n4 r7 f4 i A
// 使能中断(AINTC GER)
- ^2 N+ R2 o' O3 k3 Y" J
IntGlobalEnable();
4 ?' o+ Q$ s2 ?, r1 S
+ J( G7 Q+ y" P, d
// 使能中断(AINTC HIER)
6 z. \4 e% q: x4 p4 X
IntIRQEnable();
- M) f8 `- g5 B4 ]4 @% w& i. f( _
}
, w# l- a3 [! N* o* A( K
w9 v4 z1 s) |. F
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
o b) Y1 t1 H: I; r
/* */
+ E6 c4 C8 q! ]; s8 @* r5 S
/* 中断服务函数 */
% |/ b2 `3 ^3 H( G7 ~; f9 x. I
/* */
/ v. g1 c7 p! ], E2 {' n
/****************************************************************************/
$ q5 J! J$ p3 X
void PWMEventIsr(void)
3 u- u3 k4 {8 H) L. o! P7 F9 R* M6 y' r
{
8 w# L9 e6 I. M) D
IntSystemStatusClear(SYS_INT_EHRPWM1);
6 J0 g( n3 ]) U7 N. T( |
- c ^: e+ G1 ~; |" M
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
3 _" c$ k1 a1 A8 R O9 V0 Z2 j5 w; U
}
( h4 ^9 o* d( j8 G
$ ^' j) x9 z5 {3 x: u6 ?
void PWMTZIsr(void)
1 H6 E& n' J) G+ i% ^$ e/ u+ o
{
$ I$ y `0 P$ c0 W6 Q
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
: Q3 }7 f" m- C
* s- I) ~% G8 B) ]" ~5 _+ b. \+ x
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
9 x7 U: C/ e! i* n' A8 q6 {
}
, ~6 g y n- Y; I( X0 d4 W
# U; p. n& ]8 S& l2 ~- e+ {- X- R
/****************************************************************************/
0 q3 y v4 z% C+ ^- P) o7 \; y
/* */
: o, ~" o: B j2 D. F3 m# V
/* 初始化捕获模块 */
! r3 R' u2 d* v
/* */
E0 J8 X2 ~0 g; V& x" K( u# @
/****************************************************************************/
. k4 v1 O0 _, f w
void ECAPInit(void)
n' N! `) k0 @8 k+ y
{
/ i; ^5 M e. b0 h
/*-----设置 ECCTL1-----*/
, S! y1 [/ i8 R9 p8 d
// 使能CAP寄存器装载
7 t* q/ ~; y, @# _# h- m$ d1 I
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
- R* A4 C( [& g5 Z) W' t
// 设置预分频值.
! \1 w/ c9 \8 t+ q( { {
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
1 Z$ ?7 G8 n" L, W) V3 d b, L
// 上升沿触发捕获事件
! I2 Q8 `0 `/ P% `, r& C, }
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
- P$ [ s8 P' c" k0 g
// 输入捕获后重新装载计数器值.
* M8 T, r- g, n& q/ n5 d7 S+ \
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
% W6 Z7 y' w1 ]
) Y, L/ _2 d4 j+ o
/*-----设置 ECCTL2-----*/
: U, a8 C7 u1 P7 o. L# a
// 连续模式
8 ]* {1 `& j9 O( r+ h
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
$ m4 G1 t o6 l! K e% E) r* t5 g" Q, Y
// ECAP计数器TSCTR持续计数
$ Y" L; K! S7 N, C
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
+ J/ ]4 J7 g$ m6 b. ]. w, c, U
// 禁用同步输出和同步输入
7 H1 o! V7 _) _
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
1 Q- O Q/ M+ L7 a
// 配置 ECAP 2 为 CAPTURE 模式
& d& N2 I# R. C5 v' o
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
# ~# b& j% F$ y9 C' D: B* b
& m: [6 s8 M) A5 F2 s; K a6 Z
// 使能中断
8 ?' @( Y4 ]2 b' D
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
3 Z, x3 L5 v* Z. ~6 r
}
7 \' g) h/ [9 X% t, ~' k
1 L0 t7 O, Q7 {9 q4 H8 }9 @1 R4 o
/****************************************************************************/
3 m* U% P' G9 X+ z
/* */
' r/ l$ O. e: m
/* 取得捕获结果 */
, P" ]$ n9 Q0 I3 i& A5 t& P0 ~
/* */
# V, C. b& Z1 i5 X
/****************************************************************************/
" M! D6 m* f. y3 M
unsigned int ECAPRead(void)
. c7 j" E; ~6 [4 Z5 z7 s2 \; b
{
( X7 o- J4 G; N5 W' |
unsigned int capvalue;
2 p' x; X7 @ r" D4 q4 Q i( @
unsigned long frequency;
! Z3 u5 U9 z/ Z4 e7 E8 F+ L9 J# K
+ t* z3 ~2 A2 i5 H
// Event1 中断标志
# I& x3 q) {1 E; S" l3 t
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
6 B( b" O8 ?' Z+ J/ t7 H
{
, x( h# ^" @; R% y/ ^" B) o, O
// 取得捕获计数
7 A- \9 h# ?, {) t
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
2 ]/ m6 D0 c1 M4 a2 j k; N
capvalue = ECAPResult.cap1;
4 T3 x' @( @/ P. @% H
8 }4 {0 L1 k- U* c
// CAPTRUE 模块 228M 时钟主频
: Q9 C$ R' ]& l5 i
frequency = 228000000/capvalue;
7 X: \$ V8 z0 M! g
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
Q9 j$ y. m: W& d8 ?
/ R4 }" J4 Q) v9 r& W
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
/ x2 Y+ w5 {2 k7 Z) Q
// IntEventClear(SYS_INT_ECAP2);
4 A7 t" v$ F, P; m$ U1 y
}
$ t' @! A: d8 Q4 z7 J2 H9 d2 Z
return frequency;
3 d& F9 Y2 W* p1 _
}
s0 D- Z6 P8 P
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
( Q3 \4 i9 J) L; \
[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