📄 adc3_2_pwm4.bas
字号:
$regfile = "m88def.dat" ' ???¨??±êμ¥???ú?a ATmega88
$crystal = 1000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Portb = Output
Dim Adc_x As Word 'adc RESULT
Dim Adcxl As Byte 'X-L
Dim Adcxr As Byte 'X-R
Dim Adc_y As Word
Dim Adcyl As Byte 'Y-F
Dim Adcyr As Byte 'Y-B
Dim Adc_z As Word
Dim Adczb As Byte 'Z
Dim Int_x As Byte 'X pre-Setting. Should be set to a init val during power up
Dim Int_y As Byte 'Y
Dim Int_z As Byte 'Z
Dim Offgnd As Byte 'The edge or so called offset of hang in air
Dim Pbtmp As Byte 'PWM output temp
'PBTmp.0 NC
'PBTmp.1 Left motor
'PBTmp.2 Right motor
'PBTmp.3 Front motor
'PBTmp.4 Back motor
Dim N As Byte
Dim M As Word
Int_x = &B1000
Int_y = &B1000
Int_z = &B1000
Start Adc
Do ' main loop
Set Portb.0 'use PB.0 test how long AD need
Adc_x = Getadc(0)
Adc_y = Getadc(1)
Adc_z = Getadc(2)
Reset Portb.0
Shift Adc_x , Right , 6 'get high 4 bits
Shift Adc_y , Right , 6
Shift Adc_z , Right , 6
Adcxl = Adc_x : Adcyl = Adc_y : Adczb = Adc_z 'CHANGE WORD TO BYTE
If Adcxl >= Int_x Then ' balance left right
Adcxr = Adcxl - Int_x
Adcxr = Int_x - Adcxr
Else
Adcxr = Int_x - Adcxl
Adcxr = Int_x + Adcxr
End If
If Adcyl >= Int_y Then ' balance front back
Adcyr = Adcyl - Int_y
Adcyr = Int_y - Adcyr
Else
Adcyr = Int_y - Adcyl
Adcyr = Int_x + Adcyr
End If
Offgnd = 0
N = Offgnd + 16
Adcxl = Adcxl + Offgnd
Adcxr = Adcxr + Offgnd
Adcyl = Adcyl + Offgnd
Adcyr = Adcyr + Offgnd
If Adczb > Int_z Then 'fit G
Adcxl = Adcxl - 1
Adcxr = Adcxr - 1
Adcyl = Adcyl - 1
Adcyr = Adcyr - 1
Elseif Adczb < Int_z Then
Adcxl = Adcxl + 1
Adcxr = Adcxr + 1
Adcyl = Adcyl + 1
Adcyr = Adcyr + 1
Else
Adcxl = Adcxl
Adcxr = Adcxr
Adcyl = Adcyl
Adcyr = Adcyr
End If
Do
N = N - 1
Pbtmp = &B1 & Portb ' clear temp
'LEFT & RIGHT---------------------------
If Adcxl > 0 Then
Adcxl = Adcxl - 1
Pbtmp = Pbtmp Or &B10
Else
Adcxl = Adcxl
Pbtmp = Pbtmp And &B11111101
End If
If Adcxr > 0 Then
Adcxr = Adcxr - 1
Pbtmp = Pbtmp Or &B100
Else
Adcxr = Adcxr
Pbtmp = Pbtmp And &B11111011
End If
'FRONT & BACK---------------------------
If Adcyl > 0 Then
Adcyl = Adcyl - 1
Pbtmp = Pbtmp Or &B1000
Else
Adcyl = Adcyl
Pbtmp = Pbtmp And &B11110111
End If
If Adcyr > 0 Then
Adcyr = Adcyr - 1
Pbtmp = Pbtmp Or &B10000
Else
Adcyr = Adcyr
Pbtmp = Pbtmp And &B11101111
End If
'---------------------------------------
Portb = Pbtmp
For M = 1 To 1
Next M
Loop Until N = 0
Loop
End
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -