2012-10-02 23 views
-1

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

但是从上面的代码我正在产生正弦波。如果我输入频率然后波形频率也正好改变,但我试图改变阶段,那么这就是问题所在。如果我以90度输入相位,那么它会改变10度,但它不会改变90度。我不知道为什么它会像这样产生,我做了什么错误?我是否缺少任何位?只有阶段的问题。

在此先感谢。

如果我想输入阶段的浮点值例如2.5度,我必须改变。在函数中将“无符号整数阶段”转换为“浮点阶段”。如果我尝试这样的“< <”与float不兼容。如果我想要输入35.8度的相位,我必须做什么。请给我建议。

在此先感谢。

+0

是以弧度表示的角度? 90弧度实际上将在14度左右 –

+1

您能否提供数据表并将我们指向相关页面,其中记录了相位设置命令,只是为了表明您已完成了您的研究? –

+0

@ David Grayson数据手册页码15,我们有频率和相位寄存器写入命令。 – verendra

回答

1

从数据表中第15页:

这个信号相移为2π/ 4096×PHASEREG

如果你想使用度,在发送之前如下修改阶段(uint32_t的会可能需要包含stdint.h文件):

phase = (uint32_t)phase * 4096/360; 

如果您不是特别在意精度,您可以执行以下操作:使用16位除法代替32位除法:

phase = phase * (4096/360); 
+0

它应该是这样的阶段= 360 /阶段* 4096; – verendra

+0

请注意'4096/360'不是一个偶数整数。如果正确舍入该结果很重要,则需要写入(int)(4096.0/360.0)。您可能必须将浮点数库链接到该项目,但计算将由预处理器完成。 – Lundin

+0

@Lundin不正确,请注意我的操作顺序,它将在+/- 1范围内得到正确的值。(首先不计算4096/360)。 – CrazyCasta