2012-10-02 20 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