Funkcja MAP i generator Freq i Duty operowany potencjometrem.

Pytania, kody i porady dotyczące nie tylko Bascom.
ODPOWIEDZ
Awatar użytkownika
niveasoft
Posty: 1216
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Funkcja MAP i generator Freq i Duty operowany potencjometrem.

Post autor: niveasoft » 27 sie 2020, 15:27

Dzisiaj, tak na szybko, z potrzeby chwili, przerobiłem kod generatora tak by działał bez klawiatury a z dwóch potencjometrów.
Przy okazji pokazuję funkcję MAP która dowolną wartość z jednego zakresu skaluje na inny zakres.
Tak więc tutaj jeden potencjometr 0-1023 skaluję na częstotliwość pomiędzy 20Hz a 2kHz, a drugi 0-1023 na procent Duty 1%-99%

Może się komuś przyda. Wszystko wyświetla na LCD 2x16. Tu jest na Mega, ale powinien pasować do Uno.
  1. $regfile = "m2560def.dat"                                   '8K SRAM
  2. $crystal = 16000000
  3. $hwstack = 64
  4. $swstack = 16
  5. $framesize = 200
  6. $baud = 115200
  7.  
  8. ' FREQ DUTY GENERATOR OPERATED BY TWO POTENTIOMETERS
  9.  
  10. Debug Off
  11.  
  12. Const Min_freq = 20                                         'Hz
  13. Const Max_freq = 2000                                       'Hz
  14. Const Min_duty = 1                                          ' 1%-100%
  15. Const Max_duty = 100                                        ' 1%-100%
  16.  
  17. Config Submode = New                                        'Subs first then you can use them
  18.  
  19. '***********************************************
  20. '*           ALPHANUMERIC LCD                  *
  21. '***********************************************
  22.  
  23.    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.5 , Db6 = Portc.7 , Db7 = Porta.6 , E = Portl.5 , Rs = Portl.1       ' , Wr = Porta.1
  24.    Config Lcd = 16x2
  25.    Cursor Off , Noblink
  26.    Cls
  27.  
  28. '***********************************************
  29. '*                  I/O                        *
  30. '***********************************************
  31.  
  32.    Config Portb.7 = Output : Led Alias Portb.7              'Arduino Mega LED
  33.    Config Portb.5 = Output : Freq_out Alias Portb.5         'Freq/Duty output pin
  34.  
  35. '***********************************************
  36. '*                   ADC                       *
  37. '***********************************************
  38.  
  39. 'freq potentiometer on A0
  40. 'duty potentiometer on A1
  41.  
  42. Config Adc = Single , Prescaler = Auto , Reference = Avcc
  43.  
  44. Dim New_adc As Word , Freq_adc As Word , Duty_adc As Word
  45.  
  46. '***********************************************
  47. '*                 VARIABLES                   *
  48. '***********************************************
  49. 'multipurpose
  50.  Dim Helpb As Byte , N As Byte
  51. 'program
  52.  Dim New_freq As Word , New_duty As Word , Change As Byte
  53.  'timer
  54.  Dim Value As Dword , Ustaw As Word , Prescaler As Word , Help_d As Dword
  55.  Dim Wartosc_dla_tccr1b As Byte , Wypelnienie As Word , Presc As Byte , Proc As Word
  56.  
  57. '***********************************************
  58. '*                    TIMER1                   *
  59. '***********************************************
  60.  
  61. '----------------------------------------------------------------
  62. 'TCCR1A  -> |COM1A1  COM1A0 COM1B1 COM1B0   --    --  WGM11 WGM10
  63. 'TCCR1B  -> | ICNC1   ICES1  --    WGM13  WGM12  CS12  CS11  CS10   FOR MEGA328P
  64. 'TCCR1C  -> | FOC1A  FOC1B   --     --     --     --    --    --
  65. '----------------------------------------------------------------
  66.   Const Freq = _xtal
  67. '                    WGM13-|
  68.    Const Pwm_presc1 = &B00010001                            'for TCCR1B
  69.    Const Pwm_presc8 = &B00010010
  70.   Const Pwm_presc64 = &B00010011
  71.  Const Pwm_presc256 = &B00010100
  72. Const Pwm_presc1024 = &B00010101
  73.  
  74. Const Set_output_mode = &B10100000                          'for TCCR1A
  75.  
  76.  
  77. Function Map(byval Value As Word , Byval Min_in As Word , Byval Max_in As Word , Byval Min_out As Word , Byval Max_out As Word)as Word
  78.  Local I1 As Long
  79.  Local I2 As Long
  80.    I1 = Value - Min_in
  81.    I2 = Max_out - Min_out
  82.    I1 = I1 * I2
  83.    I2 = Max_in - Min_in
  84.    I1 = I1 / I2
  85.    I1 = I1 + Min_out
  86.    I1 = Abs(i1)
  87.    Map = I1
  88.    'Map = Abs(i1)
  89.    If Map >= Max_out Then Map = Max_out - 1
  90. End Function
  91.  
  92. Sub Calc_duty()
  93.   Help_d = Value * New_duty
  94.   Help_d = Help_d / 100
  95.   Wypelnienie = Help_d
  96.    Ocr1a = Wypelnienie
  97. End Sub
  98.  
  99. Locate 1 , 1 : Lcd "Freq="
  100. Locate 2 , 1 : Lcd "Duty="
  101.  
  102. Freq_adc = 1024 : Duty_adc = 1024                           'refresh even if zero
  103.  
  104. Do
  105.  
  106.  New_adc = 0
  107.  For N = 1 To 64
  108.   New_adc = New_adc + Getadc(0)
  109.  Next
  110.  Shift New_adc , Right , 6
  111.  
  112.  If Freq_adc <> New_adc Then
  113.   Freq_adc = New_adc
  114.  
  115.   New_freq = Map(freq_adc , 0 , 1023 , Min_freq , Max_freq)
  116.  
  117.   Locate 1 , 6 : Lcd New_freq ; "Hz  "
  118.  
  119.   Change = 1
  120.  End If
  121.  
  122.  New_adc = 0
  123.  For N = 1 To 64
  124.   New_adc = New_adc + Getadc(1)
  125.  Next
  126.  Shift New_adc , Right , 6
  127.  
  128.  If Duty_adc <> New_adc Then
  129.   Duty_adc = New_adc
  130.  
  131.   New_duty = Map(duty_adc , 0 , 1023 , Min_duty , Max_duty)
  132.  
  133.   Locate 2 , 6 : Lcd New_duty ; "%   "
  134.  
  135.   Change = 1
  136.  End If
  137.  
  138.  If Change = 1 Then
  139.   Change = 0
  140.  
  141.    Help_d = New_freq
  142.  
  143.  
  144.     If Help_d > 0 Then
  145.  
  146.      Value = Freq                                           'uC clock speed
  147.  
  148.       Select Case Help_d
  149.  
  150.        Case 1
  151.  
  152.         '256
  153.          Wartosc_dla_tccr1b = Pwm_presc256
  154.           Shift Value , Right , 8
  155.          Presc = 2                                         'nie miesci sie 256
  156.  
  157.        Case 2 To 15
  158.        '64
  159.          Wartosc_dla_tccr1b = Pwm_presc64
  160.           Shift Value , Right , 6
  161.         Presc = 64
  162.  
  163.        Case 16 To 122                                       '16000000Hz/131072 = 15Hz  '
  164.        '8
  165.          Wartosc_dla_tccr1b = Pwm_presc8
  166.           Shift Value , Right , 3
  167.          Presc = 8
  168.  
  169.        Case Else                                            '16000000Hz/131072 = 122Hz
  170.        '1
  171.          Wartosc_dla_tccr1b = Pwm_presc1
  172.          Presc = 1
  173.  
  174.       End Select
  175.  
  176.       Value = Value \ Help_d
  177.        Shift Value , Right , 1                              'divide /2
  178.  
  179.        Decr Value : Ustaw = Value                           'substract one
  180.  
  181.        Call Calc_duty()
  182.  
  183.         Icr1 = Ustaw
  184.  
  185.          Tccr1a = Set_output_mode                           'set count up, reset count down
  186.          Tccr1b = Wartosc_dla_tccr1b                        'set prescaler and WGM13
  187.  
  188.     End If
  189.  
  190.  End If
  191. Loop
  192. End
ODPOWIEDZ