访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
50%占空比输出(DSP56F805汇编)
内容导读:

;50%占空比输出:FP_PULSE_OUT
;输入量:FP_PULSE(5k_10k)
;输出量:
;说明:T=F_MAX/(FP_PULSE*nowf*1000)  我们选1分频,T(s)=N*25(ns)*2,后面*2是因为我们输出的是50%占空比
;N即为我们要设的预计记数值
;N=F_MAX*1,000,000,000/(nowf*FP_PULSE*1000*50)=F_MAX*20000/(nowf*FP_PULSE)
;我们对<3Hz的频率不于考虑。也就是说N<=#$65b9aa(合理范围)N范围#$7d0-#$65b9aa
;我们对于3Hz以下的频率不考虑,也就是不输出,对应的最大0.24Hz以下不发波!(0.24)/40000=3/5k
;我们采用自动分频发送
;==================================  
FP_PULSE_OUT:
  
;************************************** 
  move x:nowf,x0
  cmp  #0,x0
  jeq  FP_CLOSE
  cmp  #10,x0
  jcs  jump 
  ;--nowf当前频率,修改发波频率,我们把数据都转化成末尾为0.04发送,显示比较稳定。除了#1.20数据比较特殊显示抖动厉害,过滤掉   
  move x:nowf,a0    
  move #0,a1
  ;分不同情况来四舍五入数据,100上限以上的我们0.2精度,100上限以下的0.1精度
  move x:F_MAX,x0
  cmp  #10001,x0
  jcs  s_max
  move #20,x0
  jmp  j_n
s_max:      
  move #10,x0       
j_n:
  asl  a
  bfclr #$1,sr
  rep  #16
  div  x0,a
  move a0,y1
  add  x0,a
 ; asr  a       ;我们不调整了,直接判断四舍五入 
  move a1,y0
  cmp  y0,x0
  jcc  small_ok_f
  add  #1,y1
small_ok_f:      
     
  mpysu x0,y1,a 
  asr  a       ;得到最终结果
  move a0,y0
  cmp  #130,y0
  jcs  go_go
  move x0,b      ;加末尾0.05或者0.02,反正是x0的一半
  asr  b
  sub  #2,b
  move b1,b0
  move #0,b1
  add  b,a
  jmp  go_go 
jump: 
  cmp  #5,x0
  jcs  too_small
  move #10,x0
  jmp  go_go
too_small:  
  jmp  FP_CLOSE
       
go_go:     
  move a0,b0
;**************************************
  move x:F_MAX,y0    ;我们先做上限频率*#20000(可以提高精度)这里我们应该乘#40000是因为采集的是一个周期的时间,放到最后调整
  move #20000,x0
  mpysu x0,y0,a 
  asr a
  move a0,y0
  move a1,a0
  move b0,x0
  ;--准备调用div_32by16
  jsr div_32by16    
  move a0,b1
  move y0,b0     ;将结果放入b中最大值#$2faf0800
  move x:FP_PULSE,y0
  move #1,y1     ;这里可以调整分频率,1为1分频
  mpysu y0,y1,a
  asr a       ;得到的结果肯定a1=0,最大值10
  ;--准备调用div_32by16
  move a0,x0
  move b1,a0
  move b0,y0
  jsr div_32by16  
  move a0,a1
  move y0,a0     ;得到的结果最大为#$9896800,结果保存在a中  
  ;--判断如果小于5Hz则可以不考虑,也就是不发波    
  move #$65,x0
  move a1,y1   
  cmp  x0,y1     
  jeq  goon_cmp    ;相等继续比较  
  jcc  FP_CLOSE    ;可以丢弃
  jmp  n_ok     ;开始分频发送的比较
goon_cmp:  
  move #$b9ab,x0
  move a0,y0
  cmp  x0,y0
  jcc  FP_CLOSE    ;可以丢弃
   
n_ok:  
  ;--我们开始用自动分频发送,我们移位该数值,知道高16位为0为止,这时对应的移位次数就可以左移9位,然后用bfset来配置x:TMRD3_CTRL    
  move #0,a2     ;是为了用算术右移而清的0
  move #0,y0     ;用来存放移动次数的
just_on: 
  move a1,y1
  cmp  #0,y1
  jeq  out_start
  asr  a
  add  #1,y0
  jmp  just_on

out_start:
  move #0,b2
  move #0,b0
  move y0,b1
  rep  #9
  asl  b
  move b,x:TMRD3_CTRL   ;我们把得到的分频置到控制器里
  move a0,x:TMRD3_CMP1   ;用做加记数    
  bfset #$3023,x:TMRD3_CTRL  ;我们选的就是1分频,作为基频  
  move #$1,x:TMRD3_SCR 
  jmp  FP_PULSE_OUT_END  
FP_CLOSE:
  bfclr #$1,x:TMRD3_SCR   ;如果nowf为0,则不让发送方波      
FP_PULSE_OUT_END:
  rts

标签:
来源: 作者: 时间:2006/9/25 16:50:53
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐