81.gif (514.85 KB, 下載次數: 0)
下載附件
2025-10-17 12:12 上傳
BASCOM-AVR代碼:
' ==========================================================
' MAX5481數字電位器測試
'2025年10月17日
' ==========================================================
$regfile = "m16def.dat" ' 指定ATmega16單片機型號定義文件
$crystal = 8000000 ' 設置晶振頻率為8MHz
$hwstack = 64 ' 設置硬件堆棧大小為64字節
$swstack = 64 ' 設置軟件堆棧大小為64字節
$framesize = 64 ' 設置幀大小為64字節
' ==========================================================
' 引腳定義
' ==========================================================
Cs Alias Portb.4 ' 定義片選引腳CS連接到PORTB.4
' ==========================================================
' SPI 配置
' ==========================================================
' 配置硬件SPI:無中斷、MSB先傳、主機模式、時鐘極性低、相位0、無從機選擇
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Noss = 1
Spiinit ' 初始化SPI接口
' ==========================================================
' 變量定義
' ==========================================================
Dim Command_byte As Byte ' SPI命令字節
Dim Data_high As Byte ' 數據高字節
Dim Data_low As Byte ' 數據低字節
Dim Test As Word ' 測試值變量
Dim Temp_word As Word ' 臨時數據變量
' ==========================================================
' 串口配置
' ==========================================================
'Config Serialin = Buffered , Size = 20 ' 注釋掉的串口輸入緩沖配置
'Enable Interrupts ' 注釋掉的中斷使能
$baud = 9600 ' 設置串口波特率為9600
Test = 1023 ' 初始化測試值為1023(10位最大值)
' ==========================================================
' 子程序聲明
' ==========================================================
Declare Sub Write_wiper(byval Value As Word) ' 聲明寫入Wiper位置的子程序
' ==========================================================
' 主程序開始
' ==========================================================
Waitms 10 ' 延時10ms,確保系統穩定
' ==========================================================
' 主循環 - 循環測試不同的Wiper位置
' ==========================================================
Do
' 測試不同的阻值位置
Call Write_wiper(Test) ' 寫入最大阻值位置(1023)
Waitms 200 ' 延時200ms
Call Write_wiper(768) ' 寫入75%位置(768)
Waitms 200
Call Write_wiper(512) ' 寫入50%位置(512)
Waitms 200
Call Write_wiper(256) ' 寫入25%位置(256)
Waitms 200
Call Write_wiper(0) ' 寫入最小阻值位置(0)
Waitms 200
Loop
End ' 程序結束
' ==========================================================
' 寫入Wiper位置子程序 (10位數字電位器)
' SPI傳輸格式:8位命令 + 16位數據(高10位有效,低6位無效)
' ==========================================================
Sub Write_wiper(byval Value As Word)
' 命令字節: 0x00 = 寫入Wiper寄存器并立即更新
Command_byte = &H00
' 數據格式轉換:將10位數據左移6位,放到16位數據的D15-D6位置
' 因為數字電位器只使用高10位,低6位被忽略
Temp_word = Value * 64 ' 相當于左移6位(乘以2^6=64)
Data_high = High(temp_word) ' 獲取16位數據的高字節
Data_low = Low(temp_word) ' 獲取16位數據的低字節
' SPI數據傳輸過程
Reset Cs ' 片選置低,開始SPI傳輸
Spiout Command_byte , 1 ' 發送命令字節
Spiout Data_high , 1 ' 發送數據高字節
Spiout Data_low , 1 ' 發送數據低字節
Set Cs ' 片選置高,結束SPI傳輸
' 調試輸出 - 通過串口顯示傳輸的數據
Print "輸出原始值: " ; Value ' 輸出原始值
Print "輸出命令字節: " ; bin(command_byte) ' 以二進制格式輸出命令字節
Print "輸出數據高字節: " ; bin(data_high) ' 以二進制格式輸出數據高字節
Print "輸出數據低字節: " ; bin(data_low) ' 以二進制格式輸出數據低字節
Print "---" ' 輸出分隔線
End Sub
|