Help with A/D math!


Closed Thread
Results 1 to 16 of 16

Hybrid View

  1. #1
    Join Date
    Mar 2011
    Location
    Bangkok Thailand
    Posts
    16


    Did you find this post helpful? Yes | No

    Default Math solved with 16F690 Pot, Servo and LCD

    My first PIC program works!

    Description
    A pot connected to an A/D port gives 0-255
    A little converting give an output of 1mS when pot CCW and 255 when pot is max CW.
    Drives the Servo between 1-2mS
    Show the Pot input on LCD line 1, 0-255.
    Show the Pulse width in mS on LCD line 2, 1-2mS.

    Se Drawing below.

    '************************************************* ***************
    '* Name : NimSer.BAS *
    '* Date : 3/3/2011 *
    '* Notes : Move Servo 1 to 2mS depend on POT value *
    '* Show valu in mS on LCD display *
    '* For standard servo settings 1-2mS set LOW_servo con 100 *
    '* and HIGH_servo CON 200 *
    '************************************************* ***************
    'Define OSC and ADC
    DEFINE OSC 4 ' Set internal Oschillator to 4Mhz
    DEFINE ADC_BITS 8 ' Set number of bits in result
    DEFINE ADC_CLOCK 2 ' Set clock source (3=rc)
    DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS
    ' Define LCD pins
    Define LCD_DREG PORTC 'LCD data port
    Define LCD_DBIT 0 'LCD data starting bit 0 or 4
    Define LCD_RSREG PORTC 'LCD register select port
    Define LCD_RSBIT 4 'LCD register select bit
    Define LCD_EREG PORTC 'LCD enable port
    Define LCD_EBIT 5 'LCD enable bit


    TRISA = %00001001 ' RA0 = A/D input
    ADCON1.7 = 0 ' RA.1 = +Vref, Set PORTA analog and left justify result
    PORTb.6 =0 ' Prepare RB0 for high-going pulseout

    ANSEL = %00000100 ' Set PORTA.2 analog, rest digital
    ANSELH = %00000000

    ' Variables
    outpuls VAR WORD ' Variable for the calculated puls out in mS
    POT_POS VAR BYTE ' Pot position CC=0, CCW=255
    LOW_servo con 60 ' Min Servo pulse 60= 0.6mS 100=1mS
    HIGH_servo CON 200 ' Max Span from LOW_servo to HIGH_servo
    ' Span 100 gives 100+100 = 200=2mS
    Pause 500 ' Wait for LCD to start

    MainLoop: ' The Loop start here!
    ADCIN 0,POT_POS ' Read A/D channel 0 to variable SVO_POS
    outpuls =LOW_servo + (POT_POS *HIGH_servo/255) 'Calculate the outpuls in mS
    Lcdout $fe, 1, "POT_POS= ", #POT_POS ' Display POT Valu between 0-255 on line 1
    LCDOut $fe,$C0, "Puls= ",DEC (outpuls/100),".", DEC2 outpuls,"mS"' Display pulswith in mS on line 2

    PULSOUT portb.6 ,outpuls ' Move servo on pin
    PAUSE 20 ' Constant 20mS pulses(low) between outpuls
    GOTO MainLoop ' Forever
    End

    Pot to Servo and LCD.pdf

  2. #2
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,181


    Did you find this post helpful? Yes | No

    Default Re: Help with A/D math!

    Nice you got it working. Also very nice graphics in your pdf file!

    Ioannis

  3. #3
    Join Date
    Mar 2011
    Location
    Bangkok Thailand
    Posts
    16


    Did you find this post helpful? Yes | No

    Thumbs up Re: Help with A/D math!

    Thank's Ioannis. There is a long way to go. But i start to understand what every body is talking about, Loook in the datasheet, 70% of the answer is there.

    Continue the good work, I will try.

    Ole

  4. #4
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,181


    Did you find this post helpful? Yes | No

    Default Re: Help with A/D math!

    I see that you have the potential. From your first question to your complete working code there was an impressive progress.

    By he way what you used for the graphics?

    Ioannis

  5. #5
    Join Date
    Mar 2011
    Location
    Bangkok Thailand
    Posts
    16


    Did you find this post helpful? Yes | No

    Default Developer survival KIT

    Hey
    No no i have not write everything by myself, i take some examples here and there and i got help here at the forum. So i am not so smart as it looks.

    Actually i use a very old program, Freehand MX. Its still available at Adobes site. Why i use it? Because i have used it for 20 years and its in my fingertips. I made the symbol library myself, if you want it just let me know.

    My development kit always go with me.
    My MacBook Pro
    Proteus
    PicBasicPro
    MikroC pro for PIC
    PIC-kit 2
    Programmer
    Developer Board CP-Pic training, buyed in Bangkok for 60 euro. se picture.

    Great to have everything from Mac and PC in the same Computer.

    Ole
    Name:  pickit.jpg
Views: 809
Size:  84.7 KB
    http://www.etteam.com/product/01B10.html
    Last edited by thronborg; - 18th March 2011 at 00:59.

  6. #6
    Join Date
    Feb 2011
    Location
    Michigan, USA
    Posts
    33


    Did you find this post helpful? Yes | No

    Default Re: Help with A/D math!

    Hi Dave,
    I've used the DIV32 function alot for stuff like this. In your example I would do something
    like this.
    50" - 6" = 44"
    44" / 1024(10bit) = 0.042968
    convert this number to word constant in your program 42968
    multiply a/d result by 42968
    the very next line must be DIV32 statement (word var = DIV32 10000)
    then add your 6" offset (+ 600)

    example: (a/d result = 1023)
    1023 * 42968 = 43956264 '(32bit result you can't access but DIV32 can)
    res = DIV32 10000 '(res = 4395)
    res = res + 600 '(res = 4995 hundreth inches or 49.95 inches)

    Mike

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts