嵌入式开发者社区
标题:
请问一下怎么产生PWM波
[打印本页]
作者:
浙江第一帅
时间:
2018-10-30 16:46
标题:
请问一下怎么产生PWM波
请问一下怎么产生PWM波,我看用户手册里只有ECAP_APWM波的,请问怎么修改程序,可以变成产生pwm波???谢谢大家
' `- Y9 x8 ^0 d# ?' ]
作者:
浙江第一帅
时间:
2018-10-30 17:00
/****************************************************************************/
5 _' W# Z; n4 q; l p
/* */
$ W0 O& v( f x2 w9 \$ [
/* 宏定义 */
+ X$ w2 R6 A4 @) @$ S1 y
/* */
( P' D: B( i3 i% z. j2 b( E
/****************************************************************************/
z& c' [! Y% d* J$ \
// 软件断点
L( t, e) j ]8 K& F
#define SW_BREAKPOINT asm(" SWBP 0 ");
- X& M8 k+ \" e& a+ ]% b
, c3 \: k$ O/ p6 Z. k8 [% R4 b
// 时钟分频
1 D' R/ V; j; Q
#define CLOCK_DIV_VAL 228
( |. i7 w- l* Z1 k& i( Y
9 a. r! O' T# m
/****************************************************************************/
4 @6 V5 a' k* A1 W0 J) x- A
/* */
9 Z+ {8 y0 ^7 s# N$ h
/* 全局变量 */
- X" C- R. K, A( V8 |+ p4 _1 m J2 I
/* */
' q0 y: b! H! s6 ?' x
/****************************************************************************/
) r9 w! n1 v0 `
ECAPCONTEXT ECAPResult;
; _% _2 @& U0 C4 U- A. K; i
. c" _! P& m* [" t2 d8 e1 n1 H$ @
/****************************************************************************/
3 G- J7 g- c F8 t% M' M
/* */
0 @; r3 _4 R6 U5 ?1 m; E
/* 函数声明 */
, \7 Z+ o4 K2 |! I& f/ h
/* */
8 q+ h! t7 A: P
/****************************************************************************/
2 a% U: s6 O8 g' _ ]
// 外设使能配置
$ g x% g/ @* H8 H( h
void PSCInit(void);
. n/ u* C$ P C9 r8 Y+ I: V
( t1 E: `, O' K
// GPIO 管脚复用配置
; w" I* o/ \, K: k
void GPIOBankPinMuxSet();
7 U. r4 }9 H: @" i* Y, ^( D
6 P" Y( {1 x3 D( |
// 产生波形
& s2 ^+ ]; N, l2 ^, ?1 d, \
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio);
: [6 K8 b/ k! ]3 B
void ChopperWaveform(void);
( j, C( X, G0 Y' G9 x) L
: X3 g ^# I& m# t
// ECAP初始化和读函数
: C' q( Q7 b) U/ b+ G0 b! g
void ECAPInit(void);
. w; d' f, ~$ c) v1 H
unsigned int ECAPRead(void);
: `! G2 C& W* b! s; U
' q' M9 h9 {5 d- @# w/ Q6 X
//ARM 中断初始化
! t9 u5 _3 |* v, L/ M; x8 _ \
void InterruptInit(void);
B3 K: x: _$ i- ], T
) i. e- h1 t5 d9 d
// PWM 中断初始化
: }, T5 g$ e5 v+ }* q
void PWMInterruptInit(void);
! d% \/ _. f. k+ ]& C0 U
// 中断服务函数
9 l3 ^9 J, I' e) l! q
// PWM 事件
. o2 X; \: R+ r8 E% a
void PWMEventIsr(void);
$ s2 k8 _* f j
// PWM 错误控制事件
3 F* Z, J6 o5 \0 [
void PWMTZIsr(void);
1 W% n/ f0 q; ^3 z# [. g
" v' n5 B9 c0 W, H% Z
/****************************************************************************/
; ?+ ` z+ `3 @6 x) O$ M. y+ v% T
/* */
4 q& ^: E$ l7 N0 J: Z
/* 主函数 */
4 `3 `9 g2 {0 [
/* */
8 ?: o; c1 [3 Z8 U- _% X
/****************************************************************************/
/ `/ t% h& n) i5 R, R$ x( N2 W- W" y
int main(void)
* {+ k5 `- L( t$ A' v
{
- v5 W' \* E9 M$ I; a. h0 ?* w
// 外设使能配置
! v! ?8 ^/ w6 p9 }0 }
PSCInit();
B6 I! x! W% L. f# p
! D; {6 c2 S$ ?- r9 \
// 初始化串口终端 使用串口2
3 O& v6 _5 A) f, q6 P8 e; |
UARTStdioInit();
+ V3 W" g( `% g' g- Z3 f$ o
: r3 b, H2 ` C% I4 d, `2 j
// GPIO 管脚复用配置
8 o: v8 t5 c" ^. y0 d
GPIOBankPinMuxSet();
- I! P) F" \( A1 u
9 D+ p& O: ^$ f/ ]! c% R: k
// ARM 中断初始化
6 z M; Z' g* u* _+ ^
InterruptInit();
% `' C: p O) d2 X
4 o+ I! ]% @5 r& a6 j2 s
// PWM 中断初始化
6 n9 {1 b3 E0 c0 D! G, S( `& I
PWMInterruptInit();
8 u8 m/ z. Q+ A0 u/ ?4 F; P
: }& M7 w$ Q9 U* H0 V( D& U- P* ]
unsigned char i;
, E. p' ?) q1 [8 V9 [
unsigned int j;
! R: [- Z7 J3 {0 y
0 ^- f8 H( Z9 w/ d+ F4 u. j5 G; m
UARTPuts("Tronlong PWM_ECAP Application......\r\n", -1);
4 b `6 N+ ]; J' J6 E5 P5 E, H
UARTPuts("------------------------------------------------------------\r\n", -1);
U5 q' i- I9 j
UARTPuts(" C6748 PWM Test\r\n\r\n", -1);
5 m( c; U* _' ^4 V
// 产生波形
% l& W# d& d7 M B/ _
PWM1ABasic(25000,50);
# t0 f H; y1 _* ]8 k$ i
3 S: M! o+ \8 u% }6 i
UARTPuts(" C6748 PWM Test Over!\r\n",-1);
0 N/ y* \% _! ?6 V( w7 K/ b
UARTPuts("------------------------------------------------------------\r\n", -1);
0 e' J+ S4 Y- X
. r8 Q/ h, o: P8 ^4 j& k8 Z
( f1 L! K/ S$ {: l% w$ {
! c8 n, I7 ^& x/ m6 I& F" f
UARTPuts("------------------------------------------------------------\r\n", -1);
( H Z. c0 B& h( `" @ \6 `% E
UARTPuts(" C6748 ECAP Test\r\n", -1);
% p0 M. H+ I2 D7 `5 l& F
// ECAP 捕获初始化
2 i% R5 w$ L* j$ \& G2 u# y
ECAPInit();
/ I2 W7 Z( ~; c' U
UARTPuts("Initialize ECAP.......\r\n",-1);
. ~% R0 y( t! x% V
for(i=0;i<5;i++)
! B; Q9 K: i# q) m! M- Y
{
; S' l6 p; a7 j& U
for(j=0x00FFFFFF;j>0;j--); // 延时
+ g1 N0 ^& E) _4 x+ Y9 c" _' S
ECAPRead();
. C) D6 a4 k2 N: F/ a
}
$ M1 u2 m& g! T1 r
UARTPuts("\r\n",-1);
% K3 s2 o+ n+ O
UARTPuts(" C6748 ECAP Test Over!\r\n",-1);
" Q3 X8 K8 W5 y) n
UARTPuts("------------------------------------------------------------\r\n", -1);
5 v. @; n) ] x1 {8 U
- U3 ~+ j% @7 L# q0 e# Z2 C
// 主循环
/ S0 x0 N7 y: P; _! l8 p
for(;;)
9 X) Z3 o$ X" l Q5 v% ~6 W* }" q
{
& ^7 x2 j9 b# i; F" e$ V0 w) T/ F
- ?. N. X* R7 f( K' ?
}
7 i+ J: U6 f, K: [
}
+ \6 v3 R6 m9 C. P
7 S+ K) H/ @: F& e) n
/****************************************************************************/
6 B4 U7 i2 a2 ]
/* */
7 N ^' W1 i/ P/ d4 y6 ^
/* PSC 初始化 */
* g m! a; r1 I, P4 Q) O! V+ }
/* */
0 V$ E) Z5 R( m: v
/****************************************************************************/
. V: V0 P! ] V4 c& b
void PSCInit(void)
% @& b! v/ x' t% U4 p/ J- u; V; L
{
' X8 K( I$ Z& E/ U" m7 J; @ X
// 使能 EHRPWM 和 ECAP 模块
+ o% E9 i# q0 b6 j- t$ a6 K
// 对相应外设模块的使能也可以在 BootLoader 中完成
* L9 l1 z/ a! y9 m# a( P7 A/ a
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_EHRPWM, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
" x0 l. _4 T g
PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_ECAP0_1_2, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
+ Z5 m6 R0 ?0 i7 U& x0 a
}
. ^3 y/ e* z" l) m+ x. Y0 g
* @& B- Z$ y3 ]0 S7 T' z
/****************************************************************************/
5 r) j6 w& z* T5 J1 E
/* */
1 t% A! E% a. s o3 F
/* GPIO 管脚复用配置 */
0 m6 G2 `8 M6 I6 N
/* */
# ^% C& B* a# u
/****************************************************************************/
1 s. f* H: C# P- p5 @
void GPIOBankPinMuxSet(void)
5 J5 r: \( Z' l$ H" u$ J
{
; `% _- ^# A; t6 v
EHRPWM1PinMuxSetup();
- ~6 J' @7 K6 t1 b& V: _. d. Q
& W% ~) z4 x, f! Q/ N+ G
// OMAPL138 / DSP C6748 有三个增强捕获模块(ECAP)
3 E- U5 Z7 v u; y$ R
// 作为捕获功能时管脚方向为输入
; G$ \- q# p% B0 E" G
// 作为辅助脉宽调制时管脚方向为输出
+ o0 ~& T/ j) b% J' f$ {+ Y! ~
// ECAP2 / APWM2
: w9 a. x, c' u$ n, b1 }
ECAPPinMuxSetup(2);
( X7 D& V; |; \/ V0 G( ]
! h! Q% u9 f0 _3 Q
// ECAP2 / APWM2方向设置为输入
% X6 F- z$ y* e) o1 q' p
GPIODirModeSet(SOC_GPIO_0_REGS, 8, GPIO_DIR_INPUT); // GPIO0[7]
0 u* J' T- q5 E( x
}
+ U9 Z4 @2 i8 F4 P, z/ H$ I& c
0 v9 x3 H$ b) ^
/****************************************************************************/
1 W6 @" d: ?+ E% Z }
/* */
1 F4 j/ e: b2 J7 y0 \7 r7 l
/* PWM 输出波形 */
) H2 o8 k9 a |
/* */
# F+ }- E6 q+ T# S2 ?# I$ z
/****************************************************************************/
, O0 {! `8 ]1 H9 T1 I
void PWM1ABasic(unsigned int pwm_clk,unsigned short duty_ratio)
P4 o0 V7 K5 w o0 i5 m& e% `
{
8 j* P! j9 S1 s+ u' n
// 时间基准配置
3 `3 g G% ]& l' y- l r* X3 W" S6 m8 ^$ h
// 时钟配置
/ B" e5 t4 w3 F
EHRPWMTimebaseClkConfig(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL , SOC_EHRPWM_1_MODULE_FREQ);
* P( a7 L K$ `. [3 x
( P% V1 g6 q9 X$ J( V! q) V$ I
// 配置周期
7 g1 t6 H" S2 [. H) ]
EHRPWMPWMOpFreqSet(SOC_EHRPWM_1_REGS, SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL,
- v6 z6 v2 N' E9 F8 c s; n5 [/ O
pwm_clk, EHRPWM_COUNT_UP, EHRPWM_SHADOW_WRITE_DISABLE);
& R' a; R3 J! [; d( ?8 l
3 {4 j) I" d) [' N0 _
// 禁用输入同步信号
+ Y; F4 G1 f0 L
EHRPWMTimebaseSyncDisable(SOC_EHRPWM_1_REGS);
9 ]2 V) P; B7 m- E; J
7 V0 G7 x; d1 _: V" l3 Z
// 禁用输出同步信号
9 R0 T$ b& k/ ~& S
EHRPWMSyncOutModeSet(SOC_EHRPWM_1_REGS, EHRPWM_SYNCOUT_DISABLE);
2 T5 M2 |# n, B0 B4 M+ O! h4 x% d
; s' l+ ]' Y5 |; T% a" d
// 仿真(DEBUG)模式行为配置
! T8 A* Q- A, l/ |8 d
EHRPWMTBEmulationModeSet(SOC_EHRPWM_1_REGS, EHRPWM_STOP_AFTER_NEXT_TB_INCREMENT);
: {# J+ _' w- h% c. Z0 Y
" j! x1 c! i8 e+ ~
// 配置计数比较器子模块
6 O- Y4 ]3 v$ O, X1 I9 h
// 加载比较器 A 值
w/ `4 c# a4 n' e6 [6 t2 a: Z! o
EHRPWMLoadCMPA(SOC_EHRPWM_1_REGS, (SOC_EHRPWM_1_MODULE_FREQ/CLOCK_DIV_VAL/pwm_clk)*duty_ratio/100, EHRPWM_SHADOW_WRITE_DISABLE,
5 y8 G+ ~! d1 b' g4 i: U
EHRPWM_COMPA_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
* x1 w) c6 I) a/ h. d, C2 m
$ J9 B) n8 L9 {1 O7 n3 u$ E7 v1 z
// 加载比较器 B 值
7 A: ^$ `1 Z, t# h
EHRPWMLoadCMPB(SOC_EHRPWM_1_REGS, 0, EHRPWM_SHADOW_WRITE_DISABLE,
9 c$ s) q* V* d) F. `9 c1 r3 Y
EHRPWM_COMPB_NO_LOAD, EHRPWM_CMPCTL_OVERWR_SH_FL);
7 M% g1 O) y. K9 M
( K) T/ H0 F. O) c
// 功能限定配置(输出引脚触发方式设定)
* ~4 S! }/ ~2 k- v3 M
// 时间基准计数等于有效计数比较寄存器 A/B 值时EPWM1_A翻转,波形由EPWM1_A输出
/ |! a' \' r9 T. x B8 z; I
EHRPWMConfigureAQActionOnA(SOC_EHRPWM_1_REGS, EHRPWM_AQCTLA_ZRO_DONOTHING, EHRPWM_AQCTLA_PRD_DONOTHING,
! f$ }) j; A" f0 ~9 _
EHRPWM_AQCTLA_CAU_EPWMXATOGGLE, EHRPWM_AQCTLA_CAD_DONOTHING, EHRPWM_AQCTLA_CBU_EPWMXATOGGLE,
6 _9 l5 |$ d. s
EHRPWM_AQCTLA_CBD_DONOTHING, EHRPWM_AQSFRC_ACTSFA_DONOTHING);
" E( H" l3 ~$ m! s
; |8 X! @) l1 O8 R
// 禁用(旁路,信号直接输出到斩波子模块)死区模块
E. V' v: b1 T3 i% s
EHRPWMDBOutput(SOC_EHRPWM_1_REGS, EHRPWM_DBCTL_OUT_MODE_BYPASS);
. v, n3 U$ p& a" r& m
( a" x6 q- {( Z
// 禁用斩波子模块
& @$ e: Z* [' S- M4 k
EHRPWMChopperDisable(SOC_EHRPWM_1_REGS);
0 i1 D6 f) A* ]. @. B' } I9 x
4 a. X6 \) F+ G3 }
// 禁用错误控制事件
2 Q. E5 Z& Z2 J0 D
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_ONESHOT);
$ b& C2 C) u3 L6 M
EHRPWMTZTripEventDisable(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE);
( B- O d0 K: J7 B6 o
" e9 c! n, M/ ]; v
// 事件触发配置
( w2 W4 Y) `' u
// 每三次事件发生产生中断
3 f6 j0 }. I& z$ R H
EHRPWMETIntPrescale(SOC_EHRPWM_1_REGS, EHRPWM_ETPS_INTPRD_THIRDEVENT);
2 N) T- M: \4 o' c8 D3 F3 F
// 时间基准计数等于有效计数比较寄存器 B 值 产生事件
! g4 G! n- H4 U1 c, L% L! D; a
EHRPWMETIntSourceSelect(SOC_EHRPWM_1_REGS, EHRPWM_ETSEL_INTSEL_TBCTREQUCMPBINC);
1 a6 D) P4 i# l! E) B
// 使能中断
" E6 i+ f9 R# {4 j6 w; V6 Z
EHRPWMETIntEnable(SOC_EHRPWM_1_REGS);
! o( `# p) _1 b5 G
. `4 a n6 f! ]0 X9 ?# v; q: d
// 禁用高精度子模块
3 m) D. H% j) D+ Y' c6 h
EHRPWMHRDisable(SOC_EHRPWM_1_REGS);
- t2 }( f, \- u! S. ~. s5 L& r
/ ^$ [. H! Z" G& T5 O/ {' [
UARTprintf("--- PWM_clk = %d ,PWM_duty_ratio = %d ---\r\n\r\n",pwm_clk,duty_ratio);
3 U5 t0 d8 A6 \+ A
}
# v" w- K" [1 X# p: |/ m
+ Y0 `- N1 V1 e. \8 j, h
void ChopperWaveform(void)
$ d( ]8 U7 j9 E: K( H+ ^1 e$ b
{
7 q7 I) {/ {, E" E, b" H
// 50% 占空比
. P9 x4 E# M! l% h( j2 W" u
EHRPWMConfigureChopperDuty(SOC_EHRPWM_1_REGS, EHRPWM_CHP_DUTY_50_PER);
& c" p* d0 i& R) d; H3 q7 E K
// 4 分频
6 r" N/ x# V' u) Z) {& H' x8 q
EHRPWMConfigureChopperFreq(SOC_EHRPWM_1_REGS, EHRPWM_PCCTL_CHPFREQ_DIVBY4);
# z6 Y5 ~' m; J# {7 ~9 Z
// 单个脉冲宽度
" d6 b( G& G6 S
EHRPWMConfigureChopperOSPW(SOC_EHRPWM_1_REGS, 0xF);
# `$ Z' d4 _- H8 x4 t7 Q
// 使能斩波子模块
+ O9 e- U0 A! y2 b
EHRPWMChopperEnable(SOC_EHRPWM_1_REGS);
& z; F! F0 R0 S! w# H
}
9 J8 m2 ^7 Z2 W; S
/ B5 i) k) ]4 N$ h' s: Z
/****************************************************************************/
0 a5 \8 [$ n4 ~% l
/* */
! H6 L. l$ K n' R5 R
/* PWM 中断初始化 */
8 a* J8 n9 r4 j. E- W
/* */
" R: G; v: B9 X. \' M% S
/****************************************************************************/
: {4 G* q9 [9 N
void PWMInterruptInit(void)
, Q- ^1 G5 T9 V3 a; x9 C
{
' e$ C# |# G- Q
// 注册中断服务函数
7 S" k o/ Q* R, _; Q& E6 y2 }
IntRegister(SYS_INT_EHRPWM1, PWMEventIsr);
% k5 G, m3 L: G% P! t. Q
IntRegister(SYS_INT_EHRPWM1TZ, PWMTZIsr);
3 z' r$ U( l, P4 e" ?+ y
# c! K Q7 T5 F/ q
// 映射中断
9 v7 `) y9 J) a6 Q
IntChannelSet(SYS_INT_EHRPWM1, 2);
$ n/ }" J3 f! @
IntChannelSet(SYS_INT_EHRPWM1TZ, 3);
; B9 ?. C N: n- ]) {- b
2 t7 I% `, l0 v7 z& ^, N. o; [
// 使能中断
7 m" y+ x$ \4 T
IntSystemEnable(SYS_INT_EHRPWM1);
: a* X/ ]! p1 P2 A# p: `
IntSystemEnable(SYS_INT_EHRPWM1TZ);
6 G# v/ k- G' L' M9 B# z1 D* J* l
}
, j8 U# W8 d X0 X7 g3 X
2 O8 f& j$ f1 L4 u( ~" u
/****************************************************************************/
* }( j; A2 D+ L/ L* Z3 g
/* */
4 g( c7 G" M- c E
/* ARM 中断初始化 */
% X( @( ?1 r& }. @6 X. X7 }
/* */
( O& D* S$ U. m0 }# D
/****************************************************************************/
1 X1 R, y& S1 _; M! j
void InterruptInit(void)
' R0 q% |! ^2 m7 X
{
3 b2 {+ A2 j+ S: ]& @/ Z! N
// 初始化 ARM 中断控制器
0 E6 r' |: c; h3 B9 `& \
IntAINTCInit();
- b* @! S( U! M- y5 Q9 P
. h( \+ u9 |# r
// 使能 IRQ(CPSR)
6 c. l& n! I6 E) x/ J
IntMasterIRQEnable();
0 W! y8 D9 V, M* Z9 @3 f- x: A6 @5 v' O
: b7 u0 x0 B. y7 h
// 使能中断(AINTC GER)
. I' P+ |6 Y5 I( e- T& p
IntGlobalEnable();
# w% L% B2 l4 ?8 m
' D6 X5 G0 R7 j1 g
// 使能中断(AINTC HIER)
- X1 \% f- _! [2 s6 \
IntIRQEnable();
5 j$ A+ O- i% `$ H, o
}
- D( J& k L; k: E( P+ s& _
. Z8 M- Q( }# L; s4 y* n
作者:
浙江第一帅
时间:
2018-10-30 17:03
/****************************************************************************/
) |* l8 l8 g( a: {8 m9 T3 T0 _) q
/* */
% C) ^, _4 l+ o
/* 中断服务函数 */
+ q; |2 q( M/ o( s2 V
/* */
$ S6 b1 b2 p7 y! \( p& D1 ~
/****************************************************************************/
. F/ s5 q2 W( Q L" n( K
void PWMEventIsr(void)
7 X* b( f/ ~. t, _4 c" h1 Z
{
. w* ?5 n; l5 S+ L/ @* b
IntSystemStatusClear(SYS_INT_EHRPWM1);
% p- i8 K( X/ q/ d
6 i) V6 D/ x/ F1 f
EHRPWMETIntClear(SOC_EHRPWM_1_REGS);
' |8 a" y/ Y3 ]9 W
}
! X* H; D3 u; X3 j7 w
) P. H3 }/ k+ r$ h
void PWMTZIsr(void)
5 I$ Y1 h, h1 _/ K4 h2 ]$ E: `
{
2 s! i p$ J+ ]% S
IntSystemStatusClear(SYS_INT_EHRPWM1TZ);
# c9 L+ r7 P; W" \
0 j. n1 f: |4 s/ U! V
EHRPWMTZFlagClear(SOC_EHRPWM_1_REGS, EHRPWM_TZ_CYCLEBYCYCLE_CLEAR);
! l; O0 O% ~ Y! |; V+ x3 ?
}
, B2 _# f* H" q$ O C
! q [/ [4 f! U& K% Q- P
/****************************************************************************/
% r) S/ J3 h& j" ]0 X$ [' k
/* */
( D" _5 M0 |- h. }/ z# ?( d
/* 初始化捕获模块 */
( n2 S: } u! ?$ P- T# \5 [9 l$ A/ C
/* */
. Y$ n! | T' ~0 R
/****************************************************************************/
7 ~' {1 t7 d0 x( `
void ECAPInit(void)
( X: l4 E. y- j: m8 c, n& [: `2 a7 M
{
5 X3 t* l9 q7 [' q3 [
/*-----设置 ECCTL1-----*/
7 Z# d! `# u9 O7 \9 n
// 使能CAP寄存器装载
r" u m8 M8 k5 v. ?
ECAPCaptureLoadingEnable(SOC_ECAP_2_REGS);
7 X2 {& X. v. }& e7 q
// 设置预分频值.
0 f- q6 k5 {2 P% w9 [' T: d" Z, M$ ]
ECAPPrescaleConfig(SOC_ECAP_2_REGS, 0);
% u. h* \2 X4 B
// 上升沿触发捕获事件
& Q+ D4 A5 t8 p/ r3 P+ F; Z- P& S
ECAPCapeEvtPolarityConfig(SOC_ECAP_2_REGS, 0,0,0,0);
( ~; ?9 R3 O5 A0 c' A' `( ~
// 输入捕获后重新装载计数器值.
/ ^- k2 j" L4 _$ R! n# `
ECAPCaptureEvtCntrRstConfig(SOC_ECAP_2_REGS, 1,1,1,1);
4 i4 }+ J ^: O
3 q7 `, L& i, d: e+ X, z! {7 Y ]
/*-----设置 ECCTL2-----*/
t) e3 j4 y# E
// 连续模式
1 M, m( T6 a6 v, d) @/ _, G8 E
ECAPContinousModeConfig(SOC_ECAP_2_REGS);
" K* k- _* Y, `! h/ Q
// ECAP计数器TSCTR持续计数
; `! X, c& H& m
ECAPCounterControl(SOC_ECAP_2_REGS,ECAP_COUNTER_FREE_RUNNING);
. Q% B' z3 L+ K& t( L. n
// 禁用同步输出和同步输入
) }( r! r* B$ h: }- Y" _: r
ECAPSyncInOutSelect(SOC_ECAP_2_REGS, ECAP_SYNC_IN_DISABLE,ECAP_SYNC_OUT_DISABLE);
* o, p" M" }2 U$ K. f9 f, e! L
// 配置 ECAP 2 为 CAPTURE 模式
3 m- P2 w/ {8 q8 M+ Q7 h
ECAPOperatingModeSelect(SOC_ECAP_2_REGS, ECAP_CAPTURE_MODE);
: P% e6 J% x, V: ^) @
2 ]4 L" u) h* T+ z7 w
// 使能中断
# O4 B7 L7 m" }
// ECAPIntEnable(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1|ECAP_CEVT2_INT|ECAP_CEVT3_INT|ECAP_CEVT4_INT);
+ g7 {0 w, X% y4 D' h
}
) H. W2 O. ]% j# J: l+ E
$ f9 [% w% S" x ]5 w0 b
/****************************************************************************/
t G; |( e* U7 Y* W3 z( d# {
/* */
' s# Q4 T# l" G9 ~* a
/* 取得捕获结果 */
9 J0 b! A6 n2 o2 l1 E$ Y! d
/* */
* \0 k' B; J# N, V7 z
/****************************************************************************/
+ B: v1 I1 ~* l- o* F5 L* W# _
unsigned int ECAPRead(void)
1 {! T" K6 b( n0 L& [
{
; Q2 U# Z: O9 O' z" g
unsigned int capvalue;
# |- O+ Y N( M) L9 h9 S# _( s' U) F
unsigned long frequency;
. I. h+ Y6 L, a
, K4 l0 {7 V: F5 h; I+ A6 @
// Event1 中断标志
' \1 Z3 g0 S& Z. Q
if(ECAPIntStatus(SOC_ECAP_2_REGS, ECAP_CEVT1_INT))
3 ?+ s, c3 a% x( ` F
{
; Q" U" M% T) s, W, ^$ _
// 取得捕获计数
1 k3 s8 x" ?+ Y. t* t( ]4 O( C, M, s
EcapContextSave(SOC_ECAP_2_REGS,0,&ECAPResult);
( a: d5 m- j: X$ l, Q
capvalue = ECAPResult.cap1;
Z! h+ }0 O9 v& [+ ]/ w; h
" v* F* u N( _# c3 P4 H
// CAPTRUE 模块 228M 时钟主频
1 K: ?) z. _* U6 T- s
frequency = 228000000/capvalue;
! s4 N+ D! L$ f( }3 a
UARTprintf("ECAPRead:frequency = %d\r\n",frequency);
/ h5 ]4 V& Z" b- C/ i l
3 l# L7 F7 _: d0 Q6 B
ECAPIntStatusClear(SOC_ECAP_2_REGS, ECAP_ECEINT_CEVT1);
' |; r6 F; \1 K. S2 T4 B
// IntEventClear(SYS_INT_ECAP2);
' j* j" m6 x( A- ]
}
' @& b' R% Y( b9 R& q8 I
return frequency;
( p' ^7 X, A, b2 E3 R# _/ i
}
7 r6 K# f! N7 d
作者:
浙江第一帅
时间:
2018-10-30 17:58
请问一下有ECAP_APWM波产生PWM波
作者:
广州创龙莫工
时间:
2018-10-31 09:08
OMAPL138/TMS320C6748共有两个eHRPWM模块,可实现输出PWM波。我们有相关例程,请参考。
# Z% v( H* ], o/ D7 H. o
[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