Linearizing an LED for 800 pwm steps'?


Closed Thread
Results 1 to 37 of 37

Hybrid View

  1. #1
    Join Date
    Aug 2005
    Location
    Michigan, USA
    Posts
    224


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Hank,

    You got a 12F683? If so, and if you want to experiment, connect an LED to GP0 (anode) and GP5 (cathode) and try the program below. The circuit doesn't use a current limiting resistor, relying instead on the RDS(on) resistance of the I/O pin output FETs.

    The program fades the LED through sixty four gamma corrected brightness levels spanning 256 1-usec BAM duty cycle steps with a 1280-usec frame rate (781-Hz refresh rate).

    Code:
    :020000040000FA:0600000083018501F128D7
    :08000800F000030EF10083017A
    :100010000A08F2008A010408F3008C1074088500B5
    :1000200083167608850077088500162878088500ED
    :100030000030FF3E031819281D287908850002307A
    :10004000FF3E0318202824287A08850074087407C6
    :1000500074191030F41A0130F4000430FF3E031814
    :100060002E28322800007B0885002030F418243028
    :1000700074192830741A2C30F41A303084000C3083
    :10008000FF3E031840287C0885007D08F5007409B0
    :10009000F600F700F800F900FA00FB00FC00FD0094
    :1000A0000130741820300018F6068018F706001981
    :1000B000F8068019F906001AFA06801AFB06001BDA
    :1000C000FC06801BFD06840A0230F418203000185C
    :1000D000F6068018F7060019F8068019F906001AC6
    :1000E000FA06801AFB06001BFC06801BFD06840A2C
    :1000F0000430741920300018F6068018F70600192D
    :10010000F8068019F906001AFA06801AFB06001B89
    :10011000FC06801BFD06840A1030741A203000187B
    :10012000F6068018F7060019F8068019F906001A75
    :10013000FA06801AFB06001BFC06801BFD06083031
    :10014000FF3E0318A0287508850073088400720814
    :100150008A00030E8300F00E700E09008A013F39F9
    :10016000820700340134023402340234023403348E
    :1001700003340334043404340534053406340634BB
    :1001800007340834083409340A340B340C340D3481
    :100190000E340F3411341234143415341734193426
    :1001A0001B341D341F342234243427342A342D3494
    :1001B0003134353439343D34413446344B345134A0
    :1001C00057345D3464346B3472347B3483348C3410
    :1001D0009634A134AC34B734C434D134E034EF3481
    :1001E000FF340730990083169F0170308F000F1D78
    :1001F000F72883123F30840080018403841AFC288E
    :100200002030F4000130AA000230AB000330AC0013
    :100210000430AD000530AE000630AF000730B0004E
    :100220000830B1000930B2000A30B3008C019101EE
    :100230000530920083167F3092008C148312C030F8
    :100240008B0010303321B60A361B2C293608AE201D
    :10025000A000212910303321B603B61B212936080E
    :10026000AE20A0002A29B500740820393406B4064F
    :0C027000340503193429350B332908002C
    :02400E00D43F9D
    :00000001FF
    I'll also write something using the PWM module so that we can try 125-nsec PWM steps (with an 8-MHz clock).

    Cheerful regards, Mike
    Last edited by Mike, K8LH; - 10th March 2012 at 13:54.

  2. #2
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Hi Mike,
    exactly
    I haven't got a 12f683 to hand .... I'm still a rather weak/n00by programmer, so wondering what exatly that program is you've posted?!!!

    I tried 1024 PWM levels with a gamma (0.8 & 1.6), but actualy neither of them seemed to fade any better than what I had in place already (which was some anti log kludge).

    The hassle for me here is converting any lookup table to a DW table (to be able to use lots of available code space to store the lookup values), presently, I'm doing the test curves in excel, then saving to a csv...but my version of excel only allows 256 columns wide, so I have to put 1024 values the curve on 4 rows, then save it as a csv.

    Worse still the 'DW' command seems to have a restriction of somewhere in the order of 70 bytes per line entry, so I can't just use a hulking 256 byte long lines, but having to break the 4 long CSV lines, into smaller snippets....

    Code:
        DW 0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11
    & so on...what I really need is to knock up a program that takes an excel 'column' 1024 deep coverts it into blocks of lines 70 bytes long (like the above) all rpefaced with a DW on the front...because presently it's about 30 minutes work just to trial a different curve - it get tiring very quickly!

    While I'm here, can anyone field an elegant way of rescaling....let's say I have 10 bit ADC that I want to scale to a maximum of 800 PWM steps (if you are wondering what I'm trying to achive....a max LED brightnesss setting ...I hoping to have a maximum PWM value (which will differ depending upon the maximum brightness setting required) & need to rescale the incoming ADC to it ...therefore a MAX ADC value of 1023 -> max PWM value of 800 (or 600, 400...whatever I've chosen to be the maximum PWM value)....it's easy to outside of picbasic...

    (max PWM value/1023) * incoming ADC value ...but the first part of the caclulation results in a floating point number. (for example 800/1023 = 0.78201368523949169110459433040078 !!!) ....now I realise you have to gear everything up, but just wanted a little bit of guidance how this is done in Picbasic to set me on my way!
    Last edited by HankMcSpank; - 10th March 2012 at 20:32.

  3. #3
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    re the scaling...I found the floating point thread....

    http://melabs.com/resources/fp.htm

    but adding that particular bas file wiped my program out (I'm at the edge of my PIC's variable limit), so here's what I'm doing...

    I scale up the max PWM value (which will be the maximum LED brightness) by 64 (the maximum multiplier that still keeps me within 'word' constraints), then divide this value by the maximum possible incoming ADC reading (10 bit = 1023) ... I then mulitply that result by the actual incoming ADC reading ......and then divide by 64.

    I lose about 0.5% of resolution but that's pretty close for my needs.

  4. #4
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Keep coming back to this. (I I like a breather in between!)

    Is there any electronic sensor that mimics the eye's 'response' curve out there that I can buy & put a scope on its output? What I'm thinking is that if I put such a sensor directly over the LED being driven with PWM then 'shoot' for a linear slope, then that's gonna be the way forward here - else I'm sort of stabbing in the dark!

  5. #5
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,170


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Something like this maybe?

    http://www.intersil.com/content/dam/...n66/fn6691.pdf

    http://www.vishay.com/docs/49670/pl0366.pdf

    Have used before the BPW21 and is very nice.

    Ioannis
    Last edited by Ioannis; - 7th March 2013 at 17:16.

  6. #6
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,621


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    I don't know exactly HOW close to "human eye response" it is but the APDS-9300 from Avago (I2C interface, $1.60 at Digikey) claims to Approximate the human-eye response. Or perhaps one of the sensors from Vishay. I don't know enough about them to tell if they are good or bad, just Googles for a couple of minutes.

    EDIT: Weird how similar two responses can be sometimes....

  7. #7
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Hiya,

    Long time no code!

    I'm wanting to use Mike, K8LH 'Just Basic' code to generate values towards linerarizing an LED for PWM ...what Mike has done is great & & more or less ideal for my needs, but to save a bit of post editing for use with my PIC of choice, I ideally seek a way of having the code place a DW on the front of every line.

    Mike wrote it in standard basic, but I'm not familiar with syntax (besides I'm very rusty with coding now!) & hoped that someone could quickly edit the code to place a DW at the front of all the outputted lines.

    Here's Mike's code that I've modified a little already...

    Code:
    '  Maxim Gamma Correction Algorithm
    '
    '  JustBASIC (free) interpreter
    '
    Input "Gamma array size: "; arraysize
    Input " Total PWM steps: "; width
    Input "Gamma correction: "; gamma       ' maxim uses 2.5
    
    FOR index = 0 to arraysize-1
      dcyval = INT(width*(((width/arraysize*(index+1))/width)^gamma))
      if(index = 0) then
        PRINT
      else
        if(index MOD 34 = 0) then 'this dictates how many values per line
          PRINT " " 'this puts no comma at the end of the line
        else
          PRINT ","; 'this puts commas in between the values
        end if
      end if
      if(dcyval < 100) then print " ";
      if(dcyval < 10) then print " ";
      PRINT dcyval;
    NEXT index
    PRINT
    
    REM CLOSE
    The above gernerates output like this

    Code:
    Gamma array size: 255
     Total PWM steps: 1023
    Gamma correction: 2
    
      0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  8,  9,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18
     19, 20, 21, 22, 23, 25, 26, 27, 29, 30, 31, 33, 34, 36, 37, 39, 40, 42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72
     74, 77, 79, 81, 83, 86, 88, 90, 93, 95, 98,100,103,105,108,111,113,116,119,121,124,127,130,133,136,139,141,144,148,151,154,157,160,163
    166,170,173,176,180,183,186,190,193,197,200,204,208,211,215,219,222,226,230,234,238,241,245,249,253,257,261,265,269,274,278,282,286,290
    295,299,303,308,312,317,321,326,330,335,339,344,349,353,358,363,368,373,377,382,387,392,397,402,407,412,417,423,428,433,438,444,449,454
    460,465,470,476,481,487,492,498,504,509,515,521,526,532,538,544,550,556,561,567,573,579,586,592,598,604,610,616,623,629,635,641,648,654
    661,667,674,680,687,693,700,707,713,720,727,734,740,747,754,761,768,775,782,789,796,803,810,817,825,832,839,846,854,861,868,876,883,891
    898,906,913,921,928,936,944,952,959,967,975,983,991,999,1007,1014,1023
    whereas what I seek is a DW at the front of each line like thus...

    Code:
    Gamma array size: 255
     Total PWM steps: 1023
    Gamma correction: 2
    
    DW  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  8,  9,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18
    DW 19, 20, 21, 22, 23, 25, 26, 27, 29, 30, 31, 33, 34, 36, 37, 39, 40, 42, 44, 45, 47, 49, 51, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72
    DW 74, 77, 79, 81, 83, 86, 88, 90, 93, 95, 98,100,103,105,108,111,113,116,119,121,124,127,130,133,136,139,141,144,148,151,154,157,160,163
    DW 166,170,173,176,180,183,186,190,193,197,200,204,208,211,215,219,222,226,230,234,238,241,245,249,253,257,261,265,269,274,278,282,286,290
    DW 295,299,303,308,312,317,321,326,330,335,339,344,349,353,358,363,368,373,377,382,387,392,397,402,407,412,417,423,428,433,438,444,449,454
    DW 460,465,470,476,481,487,492,498,504,509,515,521,526,532,538,544,550,556,561,567,573,579,586,592,598,604,610,616,623,629,635,641,648,654
    DW 661,667,674,680,687,693,700,707,713,720,727,734,740,747,754,761,768,775,782,789,796,803,810,817,825,832,839,846,854,861,868,876,883,891
    DW 898,906,913,921,928,936,944,952,959,967,975,983,991,999,1007,1014,1023
    Can anyone help me out here?

    (the code runs with this http://www.justbasic.com/download.html )
    Last edited by HankMcSpank; - 10th May 2013 at 21:58.

  8. #8
    Join Date
    Jan 2005
    Location
    Montreal, Quebec, Canada
    Posts
    3,172


    Did you find this post helpful? Yes | No

    Default Re: Linearizing an LED for 800 pwm steps'?

    Try this modification (untested):

    Code:
    ...
      if(index = 0) then
        PRINT
        PRINT "DW ";
      else
        if(index MOD 34 = 0) then 'this dictates how many values per line
          PRINT " " 'this puts no comma at the end of the line
          PRINT "DW ";
        else
    ...
    Robert

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