C 用单片机改变信号的相位值

C 用单片机改变信号的相位值,c,embedded,avr,avr-gcc,C,Embedded,Avr,Avr Gcc,我正在尝试使用可编程波形发生器AD9833和ATmega32-A微控制器(MCLK=8MHz时钟频率)生成正弦波。我正在使用USART通信,因此如果我在超级终端中更改频率或相位,则波形频率和相位必须更改。 我为此编写了如下所示的小代码 但是从上面的代码中,我生成了正弦波。如果我输入频率,那么波形频率也会发生变化,但我试图改变相位,这就是问题所在。如果我以90度进入相位,那么它将改变10度,而不是改变90度。我不知道为什么会这样,我犯了什么错误?我漏了什么吗?仅相位问题 提前谢谢 如果我想输入相位

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

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

提前谢谢


如果我想输入相位的浮点值,例如2.5度,我必须改变什么。函数中的“无符号整数相位”变为“浮点相位”。如果我这样做,数据表第15页的“:

该信号相移2π/4096×相移

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

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

phase = phase * (4096 / 360);

角度是弧度吗?90弧度实际上是14度左右。你能提供数据表并指向记录相位设置命令的相关页面吗,只是为了表明你已经做了研究?@David Grayson数据表第15页,我们有频率和相位寄存器写入命令。如果我想输入f相位的loat值,例如2.5度,我必须更改。函数中的“unsigned int phase”可以改为“float phase”。如果我这样做,数据表中的“unsigned int phase”应该是这个相位=360/相位*4096;请注意,
4096/360
不是偶数整数。如果该结果的正确舍入很重要,则需要写入(int)(4096.0/360.0)。您可能必须将浮点数库链接到项目,但计算将由预处理器完成。@Lundin不正确,请注意我的操作顺序,它将在+/-1范围内获得正确的值。(4096/360不是先计算出来的)。@verendra您给出的数字是根据寄存器中的值使用的相位值,OP想要相反的值,即放入寄存器中以获得所需相位的值。@CrazyCasta是的,但如果您执行
unsigned int/360
,您也会遇到同样的问题。然后,如果相位大于65535/4096,您还将得到一个整数溢出。在这个平台上,as int将是16位。
phase = phase * (4096 / 360);