Już sobie poradziłem, działa:
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 10000000
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect
Config Portb = Output
Rev Alias Portb.0
Byp Alias Portb.2
Start Timer1
Start Adc
Dim Pwm As Integer
Dim Inval As Integer
Do
Inval = Getadc(0) / 4
Waitms 200
If Inval < 16 Then
Set Rev
Set Byp
Pwm = 255
Pwm1a = Pwm
Elseif Inval < 112 Then
Set Rev
Reset Byp
Pwm = 271 - Inval
Pwm1a = Pwm
Elseif Inval < 142 Then
Reset Rev
Set Byp
Pwm = 0
Pwm1a = Pwm
Elseif Inval < 239 Then
Reset Rev
Reset Byp
Pwm = Inval + 16
Pwm1a = Pwm
Else
Reset Rev
Set Byp
Pwm = 255
Pwm1a = Pwm
End If
Loop
End
***
Wprowadziłem małe zmiany i prosiłbym o ich optymalizację, bo w tej chwili używam typu Single i funkcji Round, a to nie jest dobry pomysł...
Kod: Zaznacz cały
Elseif Inval < 112 Then
Set Rev
Reset Byp
'Pwm = 271 - Inval
Pwma = 112 - Inval
Pwma = Pwma / 96
Pwma = Pwma * 153
Pwma = Pwma + 102
Pwm = Round(pwma)
Pwm1a = Pwm
(...)
Elseif Inval < 239 Then
Reset Rev
Reset Byp
'Pwm = Inval + 16
Pwma = Inval - 142
Pwma = Pwma / 97
Pwma = Pwma * 153
Pwma = Pwma + 102
Pwm = Round(pwma)
Pwm1a = Pwm
Chodzi o zamianę wartości ADC z zakresu 16...112 na wartości wypełnienia PWM z zakresu 255...102 oraz ADC 142...239 na PWM 102...255. Można sobie też darować dzielenia ADC przez 4 i pozostać przy wartościach 0...1023.
***
Odp. - zamienić kolejność dzielenia i mnożenia i robić wszystko na Integer.