打印

msp430f149单片机的最小延时问题

[复制链接]
1691|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
menzhulaok|  楼主 | 2013-8-16 22:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))   //延时1微妙
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))      //延时1毫秒
我现在有这样一个延时函数,查了一下资料“x”的值为常量或常量表达式即可,“x”能不能是小数,如果“x”能是小数,那延时不就能小于1us了,我用了几个小数试了一下,发现最小是delay(1)的一半,这是怎么回事,有没有什么更精确的延时函数,现在这个点应该是程序猿活跃的时间吧,求大神。

相关帖子

沙发
menzhulaok|  楼主 | 2013-8-17 07:44 | 只看该作者
“x”只能是常量或者表达式,有没有什么方法能让“x”可以是变量

使用特权

评论回复
板凳
hxfxt| | 2013-8-17 09:29 | 只看该作者
那你试试定时器吧.............

使用特权

评论回复
地板
menzhulaok|  楼主 | 2013-8-17 11:52 | 只看该作者
hxfxt 发表于 2013-8-17 09:29
那你试试定时器吧.............

定时器定时出来了,遇到一个问题,TACCR0只能是整数,我需要TACCR0为一个浮点数
void DelayNus(float n)
{
  CCR0=n;
  TACTL |=  MC_1;           //增计数到CCR0
  while(!(TACTL & BIT0));   //等待
  TACTL &= ~MC_1;          //停止计数
  TACTL &= ~BIT0;          //清除中断标志   
}
在进入定时器后程序出现警告,CCR0能不能是浮点数?

使用特权

评论回复
5
hxfxt| | 2013-8-17 15:15 | 只看该作者
本帖最后由 hxfxt 于 2013-8-17 15:20 编辑
menzhulaok 发表于 2013-8-17 11:52
定时器定时出来了,遇到一个问题,TACCR0只能是整数,我需要TACCR0为一个浮点数
void DelayNus(float n)
...

不可以的,只能是整数..............你是想延时多少时间啊.........你可以选择不同频率的时钟源,选择不同的计数方式来达到不同的延时啊........为什么非要是浮点数呢

使用特权

评论回复
6
menzhulaok|  楼主 | 2013-8-17 17:08 | 只看该作者
hxfxt 发表于 2013-8-17 15:15
不可以的,只能是整数..............你是想延时多少时间啊.........你可以选择不同频率的时钟源,选择不同 ...

我现在在做一个正弦波移相的东西,用延时对两个波进行移相。波的频率是20hz到20khz,430f149的单片机主频是8Mhz,定时器的最小时延是0.125us。由于移相的精度是1度,波是低频的时候还可以用0.125*CCR0(CCR0是整数)实现,波变成高频就需要小数才能延时了。有没有什么方法能解决这个事?

使用特权

评论回复
7
hxfxt| | 2013-8-17 19:10 | 只看该作者
menzhulaok 发表于 2013-8-17 17:08
我现在在做一个正弦波移相的东西,用延时对两个波进行移相。波的频率是20hz到20khz,430f149的单片机主频 ...

那你能不能将你的信号先分频后再做延时然后再倍频呢.............不然按照你说的延时的时间也太小了吧.........而且单片机主频还是固定的..........

使用特权

评论回复
8
menzhulaok|  楼主 | 2013-8-17 20:26 | 只看该作者
hxfxt 发表于 2013-8-17 19:10
那你能不能将你的信号先分频后再做延时然后再倍频呢.............不然按照你说的延时的时间也太小了吧... ...

额,好的吧,我试试,谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

1

粉丝