Miałem trochę czasu to skleciłem taki prosty na Atmega . Jest to tylko sterowanie 2 x silnik więc nie będzie to wyrafinowany program heheh.
Używa Timer0 i Timer2 . Dwa pwm kanały z Timer0 na jeden silnik i Timer2 też dwa kanały na drugi silnik przez mostek-H (ja dałem smd L298.
Dostosuj PRESCALE w konfigu dla PWM na inny jak tam będzie ci pasować pod twoje silniki . Gap dla pozycji joy jest od 100 do 150 (to też możesz zmienić ale od razu zmień wartości w dalszej części programu gdzie wylicza pwm).
Przy odczycie ADC jest pętla by wyliczyć średnią bo za bardzo skacze kiedy dostaje surowy odczyt z ADC . Można dać filtr dolnoprzepustowy ale myślę że to by był przerost formy .
Zamiast joy-a dałęm 2 potencjometry i to chyba nieliniowe , z joy-m będzie lepiej chodzić .
https://www.youtube.com/watch?v=7WvQKYqCJh8
$REGFILE = "M328PDEF.DAT"
$CRYSTAL = 20000000
$BAUD = 115200
$HWSTACK = 100
$SWSTACK = 100
$FRAMESIZE = 100
ENABLE INTERRUPTS
'*********************************************************************************************************************************
'*** ADC *************************************************************************************************************************
'*********************************************************************************************************************************
'
CONFIG Adc = SINGLE , PRESCALER = AUTO , REFERENCE = AVCC
START Adc
'
'*********************************************************************************************************************************
'*** TIMER0 / TIMER2 *************************************************************************************************************
'*********************************************************************************************************************************
'
CONFIG TIMER0 = PWM, PRESCALE = 8, COMPARE A PWM = CLEAR UP, COMPARE B PWM = CLEAR UP
CONFIG TIMER2 = PWM, PRESCALE = 8, COMPARE A PWM = CLEAR UP, COMPARE B PWM = CLEAR UP
'
'*********************************************************************************************************************************
'*** ZMIENNE *********************************************************************************************************************
'*********************************************************************************************************************************
'
DIM XADC AS WORD , PWM_1_L AS BYTE , PWM_1_P AS BYTE
DIM XX AS WORD,X AS BYTE
DIM YADC AS WORD , PWM_2_L AS BYTE , PWM_2_P AS BYTE
DIM YY AS WORD , Y AS BYTE
DO
FOR X=1 TO 10 '1 potencjometr
XADC=GETADC(0)
XX=XX+XADC
NEXT
XX=XX/10
XADC=XX
XX=0
XADC=XADC/4
FOR Y=1 TO 10 '2 potencjometr
YADC=GETADC(1)
YY=YY+YADC
NEXT
YY=YY/10
YADC=YY
YY=0
YADC=YADC/4
'----------------------------------------
'----------------------------------------
'----------------------------------------
IF XADC>100 AND XADC<150 THEN '1 silnik
COMPARE0a=0
COMPARE0b=0
END IF
IF XADC<=99 THEN
COMPARE0b=0
PWM_1_P=99-XADC
PWM_1_P=PWM_1_P*2
COMPARE0A=PWM_1_P
END IF
IF XADC>=151 THEN
COMPARE0a=0
PWM_1_L=XADC-151
PWM_1_L=PWM_1_L*2
COMPARE0b=PWM_1_L
END IF
'----------------------------------------
'2 silnik
IF YADC>100 AND YADC<150 THEN
COMPARE2a=0
COMPARE2b=0
END IF
IF YADC<=99 THEN
COMPARE2b=0
PWM_2_P=99-YADC
PWM_2_P=PWM_2_P*2
COMPARE2A=PWM_2_P
END IF
IF YADC>=151 THEN
COMPARE2a=0
PWM_2_L=YADC-151
PWM_2_L=PWM_2_L*2
COMPARE2b=PWM_2_L
END IF
LOOP
END