|
比如你想生成的PWM的时钟信号频率为10K,然后你就可以利用10K的PWM时钟源计数生成周期为(1~4095)*(1/10000)的PWM波形了。 _" l( P0 l' y
其实再次修改程序,你还可以计算PWM周期计数器与高电平相关的值。
( |0 u9 W! n5 U- E/ { 目前提供Lua脚本的
. ]9 K& J' |( ~/ I
2 \) h: o7 S% {# S% O! n8 u- & J. H7 v. S. m
- function get(my)3 l3 B+ V, G2 I3 k: _$ Y
- --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
5 U! F" r( R/ o) g6 x% _8 C9 e- S T* z - Fhirc=24000000
/ E/ M8 q1 h0 n( {: A1 S6 i9 r& s4 M, e - --下面几个变量都是临时变量使用,初始化多少都行
8 n1 V6 \2 y5 O" q - CKDIV=07 Q3 X: ]& }( m. b) J$ c3 _# g* A
- Fsys=0
- c0 o0 @9 c9 E( M" R: B8 K0 H - pre=1
! l Z& U i, S5 j - Fpwm=01 ?0 ` I3 ]2 l- d% |
- i=0, `; y7 P: g0 m! S# N
-
& I) o* C4 X! c - for CKDIV=0,255 do& W2 N' B/ a& R$ m; P4 c
- for i=0,7 do
4 O/ R0 D' Q( U _9 Z/ t$ u1 e
) h# E% i$ t4 N6 Z8 R6 i6 T- pre=2^i2 P7 X% |0 t( }8 b# `7 l
- if(CKDIV==0) then Fsys=Fhirc' f' O, D P: R+ @# l. n9 `
- elseif((CKDIV>0)and(CKDIV<=0xFF))
- S6 Y. u% O9 d; _5 Q. d - then Fsys=Fhirc/(2*CKDIV)
* T1 p" U/ D- l, L- F6 O y) J% U - end
* d/ J0 o4 l" L: J$ S - Fpwm=Fsys/pre; ~- Y& e* ?- j& A# s0 e3 }) d9 p
- if(my==Fpwm) then( |. k8 u( }- M, ^% P
- print("pre="..pre.."CKDIV="..CKDIV)
3 K4 `1 `! h5 A, n E0 `7 o J - end 9 i! n0 c$ J% a; k3 X9 A
- end
2 G/ v9 w; K8 c7 F* S2 p/ `; S - end% [- ^6 ~! E1 @* C' t
- end8 Z$ Z6 z0 I1 W& ]0 T" \% z, B
3 y( O j$ \# u/ Y- get(10000)
复制代码
6 M" i0 r- \& x& J
2 d! { w4 q( D: k
发现有两组参数可以满足需求
9 e8 s Z8 h+ A- T* Gpre=16.0CKDIV=75" }' V+ |1 I( V, j
pre=8.0CKDIV=150
4 A- @8 D" e6 D& e1 E
# T1 {8 J( @* I* }7 vCKDIV是这里,选择内部的RC振荡器后的分频
" ^. B# a5 D! z
7 G/ d& p5 V+ x/ V, c( g) ]' M
CKDIV = 75;& W2 r8 f4 Z# C* P" D6 j
PWM0_ClockSource(PWM_FSYS,16);7 h1 [+ t" G% A
或者, y' e5 u/ m! d/ I- S5 ?9 J
CKDIV = 150;PWM0_ClockSource(PWM_FSYS,8);
" y5 X0 n$ n: n1 }5 {- function get(my)
( d! {$ H/ y; M' H - --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
* D) I0 q3 s0 a4 G: P7 H% A! s - Fhirc=24000000
3 W' i- [' P E" q( a - --下面几个变量都是临时变量使用,初始化多少都行
: c/ J8 _8 r: Y G; Q - CKDIV=0
6 j q% s- O) a* }) ^8 H - Fsys=0$ z5 n5 ~4 ?- W$ c
- pre=15 Q# O6 a g/ F4 ^: B4 G
- Fpwm=0
9 \2 H- M7 K) ]9 D3 @, f - i=02 a1 B, C! r8 i! t
-
7 e R, D5 }! B8 X* r - for CKDIV=0,255 do/ E6 H" v$ N4 m. C
- for i=0,7 do
F* \3 t8 b' q& y/ W( ~4 x
+ u7 W9 `8 D% }) J- A- pre=2^i
2 R i/ k4 s( g V; K0 j* U' A2 z5 F- t - if(CKDIV==0) then Fsys=Fhirc
& m& r* g/ C6 v; {# }1 L - elseif((CKDIV>0)and(CKDIV<=0xFF))
9 k) H! p: L# \) R9 A0 u2 K% ] - then Fsys=Fhirc/(2*CKDIV)
# j7 t: `) K' G; n - end3 [ V; d2 }3 A6 I: U- d8 F0 n2 m! }
- Fpwm=Fsys/pre" @5 _& v: j T. X1 T5 Z. X
- if(my==Fpwm) then: b) O7 t, c* F$ J- o y2 |+ o
- print("PWM时钟频率为"..my.."Hz".." 需要设置".."pre="..pre..", CKDIV="..CKDIV)' Q, ~/ x9 `3 T# N9 G
- end
& m9 f1 L# _- ?% _: m - end
: o' {( w' O: Q( H4 w - end
: a+ R' u9 e9 K2 I0 g$ f3 a - end; b/ G: g3 ?( A0 N
9 x+ E7 p' o: {+ @- get(10000); f. y6 ]! [7 J5 Q) J
- print("-----------------------------------")8 o" d# j' A3 P& S0 W8 u
- get(15000)
, F+ A" {, F" f: B: x) [ T3 K - print("-----------------------------------")
' I4 W) }- P+ v) ]% y1 f4 h - get(20000)
复制代码 " `( N" l! |0 D2 D
优化了一下显示形式,输出结果,可以看出为了达到某个结果,实际上可以通过多组分频组合实现。; P' p- D' [" z( B. w" u% B$ V/ _4 m
- . [( \; k9 D! S \2 G9 v. [
- PWM时钟频率为10000Hz 需要设置pre=16.0, CKDIV=75# F p% i0 p, V9 M6 V
- PWM时钟频率为10000Hz 需要设置pre=8.0, CKDIV=150
! O, h$ r# @! ?6 m, S9 a- `! W - -----------------------------------1 w# \; }1 P6 D: y( B8 r
- PWM时钟频率为15000Hz 需要设置pre=32.0, CKDIV=25
$ N/ n+ Y4 W( P - PWM时钟频率为15000Hz 需要设置pre=16.0, CKDIV=50, e# ~; K0 d4 {
- PWM时钟频率为15000Hz 需要设置pre=8.0, CKDIV=100/ b% Y( a- Z w Z* Y7 A
- PWM时钟频率为15000Hz 需要设置pre=4.0, CKDIV=200
" S, e: o% i2 P7 r, N - -----------------------------------
q3 c0 z) a7 p* Z# q& z - PWM时钟频率为20000Hz 需要设置pre=8.0, CKDIV=75. r* M+ S( A; U
- PWM时钟频率为20000Hz 需要设置pre=4.0, CKDIV=150
复制代码 ! }8 t! b" ^ P4 A/ o2 ?/ }8 H
! F8 P" _* Q [% ^1 s& a6 {
|