你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用Lua编写计算ML51单片机PWM时钟源的程序

[复制链接]
gaosmile 发布时间:2021-1-28 10:36
比如你想生成的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
  1. & J. H7 v. S. m
  2. function get(my)3 l3 B+ V, G2 I3 k: _$ Y
  3. --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
    5 U! F" r( R/ o) g6 x% _8 C9 e- S  T* z
  4.         Fhirc=24000000
    / E/ M8 q1 h0 n( {: A1 S6 i9 r& s4 M, e
  5. --下面几个变量都是临时变量使用,初始化多少都行      
    8 n1 V6 \2 y5 O" q
  6.         CKDIV=07 Q3 X: ]& }( m. b) J$ c3 _# g* A
  7.         Fsys=0
    - c0 o0 @9 c9 E( M" R: B8 K0 H
  8.         pre=1
    ! l  Z& U  i, S5 j
  9.         Fpwm=01 ?0 `  I3 ]2 l- d% |
  10.         i=0, `; y7 P: g0 m! S# N
  11.       
    & I) o* C4 X! c
  12.         for CKDIV=0,255 do& W2 N' B/ a& R$ m; P4 c
  13.                 for i=0,7 do
    4 O/ R0 D' Q( U  _9 Z/ t$ u1 e

  14. ) h# E% i$ t4 N6 Z8 R6 i6 T
  15.                                 pre=2^i2 P7 X% |0 t( }8 b# `7 l
  16.                                 if(CKDIV==0)        then Fsys=Fhirc' f' O, D  P: R+ @# l. n9 `
  17.                                 elseif((CKDIV>0)and(CKDIV<=0xFF))
    - S6 Y. u% O9 d; _5 Q. d
  18.                                                                 then Fsys=Fhirc/(2*CKDIV)
    * T1 p" U/ D- l, L- F6 O  y) J% U
  19.                                 end
    * d/ J0 o4 l" L: J$ S
  20.                                 Fpwm=Fsys/pre; ~- Y& e* ?- j& A# s0 e3 }) d9 p
  21.                                 if(my==Fpwm) then( |. k8 u( }- M, ^% P
  22.                                 print("pre="..pre.."CKDIV="..CKDIV)
    3 K4 `1 `! h5 A, n  E0 `7 o  J
  23.                                 end                       9 i! n0 c$ J% a; k3 X9 A
  24.                 end
    2 G/ v9 w; K8 c7 F* S2 p/ `; S
  25.         end% [- ^6 ~! E1 @* C' t
  26. end8 Z$ Z6 z0 I1 W& ]0 T" \% z, B

  27. 3 y( O  j$ \# u/ Y
  28. get(10000)
复制代码

6 M" i0 r- \& x& J
微信图片_20210128103515.png 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
微信图片_20210128103520.png
# T1 {8 J( @* I* }7 v
CKDIV是这里,选择内部的RC振荡器后的分频
" ^. B# a5 D! z
微信图片_20210128103524.png 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);

  1. " y5 X0 n$ n: n1 }5 {
  2. function get(my)
    ( d! {$ H/ y; M' H
  3. --这个是选择系统的时钟源,这里默认选择内置的24M时钟HIRC
    * D) I0 q3 s0 a4 G: P7 H% A! s
  4.         Fhirc=24000000
    3 W' i- [' P  E" q( a
  5. --下面几个变量都是临时变量使用,初始化多少都行      
    : c/ J8 _8 r: Y  G; Q
  6.         CKDIV=0
    6 j  q% s- O) a* }) ^8 H
  7.         Fsys=0$ z5 n5 ~4 ?- W$ c
  8.         pre=15 Q# O6 a  g/ F4 ^: B4 G
  9.         Fpwm=0
    9 \2 H- M7 K) ]9 D3 @, f
  10.         i=02 a1 B, C! r8 i! t
  11.       
    7 e  R, D5 }! B8 X* r
  12.         for CKDIV=0,255 do/ E6 H" v$ N4 m. C
  13.                 for i=0,7 do
      F* \3 t8 b' q& y/ W( ~4 x

  14. + u7 W9 `8 D% }) J- A
  15.                                 pre=2^i
    2 R  i/ k4 s( g  V; K0 j* U' A2 z5 F- t
  16.                                 if(CKDIV==0)        then Fsys=Fhirc
    & m& r* g/ C6 v; {# }1 L
  17.                                 elseif((CKDIV>0)and(CKDIV<=0xFF))
    9 k) H! p: L# \) R9 A0 u2 K% ]
  18.                                                                 then Fsys=Fhirc/(2*CKDIV)
    # j7 t: `) K' G; n
  19.                                 end3 [  V; d2 }3 A6 I: U- d8 F0 n2 m! }
  20.                                 Fpwm=Fsys/pre" @5 _& v: j  T. X1 T5 Z. X
  21.                                 if(my==Fpwm) then: b) O7 t, c* F$ J- o  y2 |+ o
  22.                                 print("PWM时钟频率为"..my.."Hz".."        需要设置".."pre="..pre..",        CKDIV="..CKDIV)' Q, ~/ x9 `3 T# N9 G
  23.                                 end                       
    & m9 f1 L# _- ?% _: m
  24.                 end
    : o' {( w' O: Q( H4 w
  25.         end
    : a+ R' u9 e9 K2 I0 g$ f3 a
  26. end; b/ G: g3 ?( A0 N

  27. 9 x+ E7 p' o: {+ @
  28. get(10000); f. y6 ]! [7 J5 Q) J
  29. print("-----------------------------------")8 o" d# j' A3 P& S0 W8 u
  30. get(15000)
    , F+ A" {, F" f: B: x) [  T3 K
  31. print("-----------------------------------")
    ' I4 W) }- P+ v) ]% y1 f4 h
  32. get(20000)
复制代码
" `( N" l! |0 D2 D
优化了一下显示形式,输出结果,可以看出为了达到某个结果,实际上可以通过多组分频组合实现。; P' p- D' [" z( B. w" u% B$ V/ _4 m
  1. . [( \; k9 D! S  \2 G9 v. [
  2. PWM时钟频率为10000Hz        需要设置pre=16.0,        CKDIV=75# F  p% i0 p, V9 M6 V
  3. PWM时钟频率为10000Hz        需要设置pre=8.0,        CKDIV=150
    ! O, h$ r# @! ?6 m, S9 a- `! W
  4. -----------------------------------1 w# \; }1 P6 D: y( B8 r
  5. PWM时钟频率为15000Hz        需要设置pre=32.0,        CKDIV=25
    $ N/ n+ Y4 W( P
  6. PWM时钟频率为15000Hz        需要设置pre=16.0,        CKDIV=50, e# ~; K0 d4 {
  7. PWM时钟频率为15000Hz        需要设置pre=8.0,        CKDIV=100/ b% Y( a- Z  w  Z* Y7 A
  8. PWM时钟频率为15000Hz        需要设置pre=4.0,        CKDIV=200
    " S, e: o% i2 P7 r, N
  9. -----------------------------------
      q3 c0 z) a7 p* Z# q& z
  10. PWM时钟频率为20000Hz        需要设置pre=8.0,        CKDIV=75. r* M+ S( A; U
  11. PWM时钟频率为20000Hz        需要设置pre=4.0,        CKDIV=150
复制代码
! }8 t! b" ^  P4 A/ o2 ?/ }8 H
! F8 P" _* Q  [% ^1 s& a6 {
赞 收藏 评论0 发布时间:2021-1-28 10:36

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版