【问题标题】:Changing phase value of the signal using microcontroller使用微控制器改变信号的相位值
【发布时间】:2012-10-02 22:02:49
【问题描述】:

我正在尝试使用带有 ATmega32-A 微控制器的可编程波形发生器 AD9833 生成正弦波。(MCLK =8MHz 时钟频率)。我正在使用 USART 通信,所以如果我在超级终端中改变频率或相位,那么波形频率和相位必须改变。 我为此编写了小代码,如下所示。

但是从上面的代码中我正在生成正弦波。如果我输入频率,那么波形频率也会完全改变,但我试图改变相位,那么这就是问题所在。如果我进入相位为 90,那么它会改变 10 度,它不会改变 90。我不知道它为什么会这样产生以及我犯了什么错误?我错过了什么吗?仅相位问题。

提前致谢。

如果我想输入相位的浮点值,例如 2.5 度,我必须改变什么。在函数中将“无符号整数阶段”转换为“浮点阶段”。如果我这样尝试,“

提前致谢。

【问题讨论】:

  • 角度是弧度吗? 90 弧度实际上是 14 度左右
  • 您能否提供数据表并将我们指向记录相位设置命令的相关页面,以表明您已完成研究?
  • @David Grayson 数据表第 15 页,我们有频率和相位寄存器写入命令。
  • 如果我想输入相位的浮点值,例如 2.5 度,我必须改变什么。在函数中将“无符号整数阶段”转换为“浮点阶段”。如果我这样尝试,“

标签: c embedded avr avr-gcc


【解决方案1】:

从数据表第 15 页:

此信号相移 2π/4096 × PHASEREG

如果您想使用度数,请在发送之前按如下方式修改相位(uint32_t 可能需要包含 stdint.h 文件):

phase = (uint32_t)phase * 4096 / 360;

如果您不是特别关心精度,您可以执行以下操作,使用 16 位除法而不是 32 位除法:

phase = phase * (4096 / 360);

【讨论】:

  • 从数据表看应该是这样的 phase=360/phase*4096;
  • 请注意4096 / 360 不是偶数。如果该结果的正确舍入很重要,则需要编写 (int)(4096.0 / 360.0)。您可能需要将浮点数库链接到项目,但计算将由预处理器完成。
  • @Lundin 不正确,注意我的操作顺序,它会在+/- 1内得到正确的值。(4096/360不是先计算的)。
  • @verendra 您给出的数字是根据寄存器中的值使用的相位值,OP想要相反的值,将值放入寄存器以获得所需的相位.
  • @CrazyCasta 是的,但如果你这样做unsigned int / 360,你也会遇到同样的问题。然后如果相位大于 65535/4096,你也会得到一个整数溢出。因为 int 在这个平台上将是 16 位。
猜你喜欢
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多