Linearizing an LED for 800 pwm steps'?


Closed Thread
Results 1 to 37 of 37

Hybrid View

  1. #1
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

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

    Thanks guys, I'm pursung Shawn's method now, a couple of things I've spotted that might need adjustment...

    Code:
    if x>255 then lookup2 x-255, [256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,_
    301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,_
    335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,_
    370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,_
    405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,_
    441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,_
    477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511],duty
    In other words, for the second table I think I need to use lookup2 ( as the data in the send group of lookups are words), also I need to take 256 off the index value ....else it's trying to lookup the 256th->512th values in the data list .....but the data list runs 0 thru 255.

    Anyway, many thanks....I'll let you know how I get on!
    Last edited by HankMcSpank; - 27th February 2012 at 10:17.

  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'?

    Boo hiss - No workeee, man cries.

    lookup2 only allows up to 85 values in the list. ...I then tried to group all the lookup data I need into blocks of 85 values....but I spontaneously combusted (which gave my wife a bit of a fright)

    Any other ideas how to get creative ...I just need to reference at least 512 values in a list (actually, I'd ideally like 1024 values) for a modest 12f1840? (it's got 7kb of program space)
    Last edited by HankMcSpank; - 27th February 2012 at 11:20.

  3. #3
    Join Date
    Apr 2007
    Location
    Pennsylvania, USA
    Posts
    158


    Did you find this post helpful? Yes | No

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

    What if you keep all the values below 256 and do multiple lookup tables with some simple maths.

    ex.

    if X<256 then lookup X, [0,...255],duty
    if X>255 and X<512 then lookup X-256, [0,...255],duty
    if X>511 and X<768 then lookup X-512, [0,...255],duty
    if X>767 then lookup X-768, [0,...255],duty

    You will loose some resolution in the upper bits, but that is where it doesn't matter for this application.
    Last edited by spcw1234; - 27th February 2012 at 13:22.
    Shawn

  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'?

    but the numbers are non linear ...for example here are the first 256 numbers....

    Code:
    0,0,0,0,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,
    8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,
    14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,16,17,17,17,17,17,18,18,18,18,18,19,19,19,
    19,19,20,20,20,20,20,21,21,21,21,22,22,22,22,22,23,23,23,23,23,24,24,24,24,24,25,25,25,
    25,26,26,26,26,26,27,27,27,27,28,28,28,28,28,29,29,29,29,30,30,30,30,31,31,31,31,31,32,
    32,32,32,33,33,33,33,34,34,34,34,35,35,35,35,36,36,36,36,37,37,37,37,38,38,38,38,39,39,39,
    39,40,40,40,40,41,41,41,41,42,42,42,43,43,43,43,44,44,44,44,45,45,45,46,46,46,46,47,47,47,
    48,48,48,48,49,49,49,50,50,50,50,51,51,51,52,52,52,53,53,53,53,54,54,54,55,55,55,56,56,56,57
    & here are the final 256 values I need to look up against...

    Code:
    57,57,58,58,58,59,59,59,59,60,60,60,61,61,62,62,62,63,63,63,64,64,64,65,65,65,66,66,66,67,
    67,67,68,68,69,69,69,70,70,70,71,71,72,72,72,73,73,74,74,74,75,75,76,76,76,77,77,78,78,78,
    79,79,80,80,80,81,81,82,82,83,83,84,84,84,85,85,86,86,87,87,88,88,89,89,90,90,90,91,91,92,
    92,93,93,94,94,95,95,96,96,97,98,98,99,99,100,100,101,101,102,102,103,104,104,105,105,106,
    106,107,108,108,109,109,110,111,111,112,113,113,114,114,115,116,116,117,118,118,119,120,
    120,121,122,123,123,124,125,125,126,127,128,128,129,130,131,132,132,133,134,135,136,137,
    137,138,139,140,141,142,143,144,145,145,146,147,148,149,150,151,152,153,154,155,157,158,
    159,160,161,162,163,164,166,167,168,169,171,172,173,175,176,177,179,180,182,183,185,186,188,
    189,191,193,194,196,198,200,201,203,205,207,209,211,213,216,218,220,223,225,228,230,233,236,
    239,241,245,248,251,255,258,262,266,270,275,279,284,290,295,301,308,315,323,332,341,352,365,
    380,398,422,455,512
    (so the second tranche are mainly bytes, but a fair few words too)


    I don't see how maths can be applied to the numbers like you're suggesting?

    here's the vibe I'm try to get (ie the data above plotted on a graph)...
    Last edited by HankMcSpank; - 27th February 2012 at 13:34.

  5. #5
    Join Date
    Apr 2007
    Location
    Pennsylvania, USA
    Posts
    158


    Did you find this post helpful? Yes | No

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

    Not sure how to explain it at the moment, but the values above 255 would have to have 256 subtracted out from them (add this back in when you do the PWM statement) to keep it all below bytes. Let me try to explain this.

    The other math is just for your lookup steps. first table of 256 values (your numbers) works the way you have it. To lookup the next 256 your adc value will be 256-511, so subtract 256 from this value to give you the approporiate position in the lookup table. Use your data for the second lookup table. The only catch is when the values in the lookup table jump above 255. I would simply subtract 256 from the values you calculated and use those new numbers in the lookup table. Then in your PWM statement if the ADC valaue is above 490 (the point in your table that goes above 255) add 256 to the final duty value. Hope this makes some sense, maybe I am overlooking something.
    Shawn

  6. #6
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

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

    Hi Shawn,

    Actually I followed all of that...I'll have a pop at this later - many thanks!

    (I'm quite surprised how convolute it is just to get 512 word values looked up in a small pic with heaps of program space!)

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

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

    Quote Originally Posted by HankMcSpank View Post
    lookup2 only allows up to 85 values in the list. ...

    That was increased to 1024 in PBP3.
    Bug fixes and tweaks:
    • Limit on LOOKUP2 item list increased to 1024 for Mid-Range and Enhanced Mid-Range architectures.
    • ...
    But each value in a LOOKUP2 requires 3 WORDs.
    1024 values will use 3K from the 4K available on the 12F1840..


    Any other ideas how to get creative ...I just need to reference at least 512 values in a list (actually, I'd ideally like 1024 values) for a modest 12f1840? (it's got 7kb of program space)

    This method can store 1024 14-bit values in 1024 words of program space.
    http://www.picbasic.co.uk/forum/show...php?t=3891#LAB
    DT

  8. #8
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

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

    Hi Darrel,

    thanks for he info...re the ext modifier, your example in the thread you linked to shows how to store one value in one location, but how would I store many follow on values....do I have to have a huge amount of similar associated lines


    Code:
    GOTO OverData             ; Make sure data doesn't try to execute
    ASM
    DataTable
        DW  1234h, 2178h     ; etc.
    endasm
    OverData:
    So for example, let's say I want to store eight words, starting at location 2049 of codespace (of my pic12f1840), for example the following values....

    256,257,258,259,260,261,262,263,264


    what would that look like?

    Once I get the overall vibe, then I'm rocking...... :-)

  9. #9
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

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

    There's no need to put it at a specific location (2049).
    It's just in-line data that can be anywhere in code space.
    The DataTable label let's the compiler know where it is.

    The example shows putting two values in two locations.
    Just continue putting more data in as needed. You can use multiple lines,
    Code:
        DW 256,257,258,259,260,261,262,263,264
        DW 268,270 ... etc.
    And rember that the READCODE has to be AFTER the DataTable.
    Another reason not to put it at a specific address.
    Last edited by Darrel Taylor; - 28th February 2012 at 03:19.
    DT

  10. #10
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    4,175


    Did you find this post helpful? Yes | No

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

    Do you have any freedom to make hardware changes?

    PWM controlling the current of the LED will give the best results.

    So you could use a PWM output to drive a programmable constant current which in turn will drive the LED.

    It sounds complicated but is not that much. Look at the schematic.

    Name:  LED_CONTROL.png
Views: 4323
Size:  2.5 KB
    PWM output is filtered and drives the transistor that operates as a constant current driver. Current is controlled by R2 and should be selected to satisfy max LED current.

    R1 and C1 be 5-10 times the PWM frequency.

    Ioannis

  11. #11
    Join Date
    Mar 2009
    Posts
    653


    Did you find this post helpful? Yes | No

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

    Darrel,

    That works a treat...many thanks :-)

    A monster 1024 value table .....& as compact as Mr Compact's very compact car ....which in turn has been compacted & stored in a very compact gap between two houses.

    Code:
    DataWord  VAR  WORD
    counter1    VAR  WORD
    DataTable CON  EXT
    '-----[The DATA table]--------------------------------------------------------
    GOTO OverData             ; Make sure data doesn't try to execute
    ASM
    DataTable
        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
        DW 11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,16,16,16,17,17,17,17,17,17,18,18,18,18,18,18,19,19,19,19,19
        DW 19,20,20,20,20,20,20,21,21,21,21,21,21,22,22,22,22,22,22,23,23,23,23,23,23,24,24,24,24,24,24,25,25,25,25,25,25,26,26,26,26,26,27,27,27,27,27,27,28,28,28,28,28
        DW 28,29,29,29,29,29,29,30,30,30,30,30,31,31,31,31,31,31,32,32,32,32,32,33,33,33,33,33,33,34,34,34,34,34,34,35,35,35,35,35,36,36,36,36,36,37,37,37,37,37,37,38,38
        DW 38,38,38,39,39,39,39,39,40,40,40,40,40,40,41,41,41,41,41,42,42,42,42
        DW 42,43,43,43,43,43,44,44,44,44,44,44,45,45,45,45,45,46,46,46,46,46,47,47,47,47,47,48,48,48,48,48,49,49,49,49,49,50,50,50,50,50,51,51,51,51
        DW 51,52,52,52,52,53,53,53,53,53,54,54,54,54,54,55,55,55,55,55,56,56,56,56,56,57,57,57,57,58,58,58,58,58,59,59,59,59,59,60,60,60,60,61,61,61,61
        DW 61,62,62,62,62,63,63,63,63,63,64,64,64,64,65,65,65,65,65,66,66,66,66,67,67,67,67,67,68,68,68,68,69,69,69,69,70,70,70,70,70,71,71,71,71,72,72
        DW 72,72,73,73,73,73,74,74,74,74,74,75,75,75,75,76,76,76,76,77,77,77,77,78,78,78,78,79,79,79,79,80,80,80,80,81,81,81,81,82,82,82,82,83,83,83,83
        DW 84,84,84,84,85,85,85,85,86,86,86,86,87,87,87,87,88,88,88,89,89,89,89,90,90,90,90,91,91,91,91,92,92,92,93,93,93,93,94,94,94,94,95,95,95,96,96
        DW 96,96,97,97,97,97,98,98,98,99,99,99,99,100,100,100,101,101,101,101,102
        DW 102,102,103,103,103,103,104,104,104,105,105,105,105,106,106,106,107,107,107,108,108,108,108,109,109,109,110,110,110,111,111,111,111,112,112
        DW 112,113,113,113,114,114,114,115,115,115,116,116,116,116,117,117,117,118,118,118,119,119,119,120,120,120,121,121,121,122,122,122,123,123,123,124
        DW 124,124,125,125,125,126,126,126,127,127,127,128,128,128,129,129,129,130,130,130,131,131,132,132,132,133,133,133,134,134,134,135,135,135,136,136
        DW 137,137,137,138,138,138,139,139,139,140,140,141,141,141,142,142,142,143,143,144,144,144,145,145,146,146,146,147,147,147,148,148,149,149,149,150
        DW 150,151,151,151,152,152,153,153,153,154,154,155,155,156,156,156,157,157,158,158,158,159,159,160,160,161,161,161,162,162,163,163,164,164,165,165
        DW 165,166,166,167,167,168,168,169,169,169,170,170,171,171,172,172,173,173,174,174,175,175,175,176,176,177,177,178,178,179,179,180,180,181,181,182
        DW 182,183,183,184,184,185,185,186,186,187,187,188,188,189,189,190,190,191,191,192,193,193,194,194,195,195,196,196,197,197,198,198,199,200,200,201, 201,202,202,203
        DW 204,204,205,205,206,206,207,208,208,209,209,210,211,211,212,212,213,214,214,215,215,216,217,217,218,219,219,220,221,221,222,222,223,224,224,225,226,226,227,228
        DW 228,229,230,230,231,232,233,233,234,235,235,236,237,238,238,239,240,240,241,242,243,243,244,245,246,246,247,248,249,250,250,251,252,253,253,254,255,256,257,258
        DW 258,259,260,261,262,263,263,264,265,266,267,268,269,270,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295
        DW 296,297,298,299,300,301,303,304,305,306,307,308,309,311,312,313,314,315,317,318,319,320,322,323,324,326,327,328,329,331,332,334,335,336,338,339,341,342,344,345
        DW 347,348,350,351,353,354,356,358,359,361,362,364,366,368,369,371,373,375,377,378,380,382,384,386,388,390,392,394,396,398,401,403,405,407,410,412,414,417,419,422
        DW 424,427,429,432,435,437,440,443,446,449,452,455,458,462,465,468,472,475,479,483,487,490,495,499,503,507,512,517,521,526,532,537,543,548,554,561,567,574,581,589
        DW 597,605,614,624,634,645,657,670,684,699,717,736,759,786,819
        DW 862,922,1023
    endasm
    Overdata:   ' this is a jump point to make sure the above data table isn't executed
    increment_loop:
    if counter1 < 1023 then
    COUNTER1 =COUNTER1+1
    ReadCODE  (DataTable + COUNTER1), DataWord
    duty = dataword
    gosub change_pwm
    pause 1
    GOTO increment_loop
    endif
    decrement_loop:
    if counter1 > 0 then
    COUNTER1 =COUNTER1-1
    ReadCODE  (DataTable + COUNTER1), DataWord
    duty = dataword
    gosub change_pwm
    pause 1
    GOTO decrement_loop
    endif
    GOTO increment_loop
    change_pwm:
    CCP1CON.4 = Duty.0       'Bit 0
    CCP1CON.5 = Duty.1       'Bit 1
    CCPR1L = Duty >> 2       'Bit 2-7
    return
    I've now get a smoothtastic fading up/down LED. (there did appear to be one gotcha...being of the lazy ilk, I wanted each DW line to be 256 values long - nope, max allowed seems to be about 65-70 bytes - I can't be exact but it is in or around that value ....so lots of DW lines needed)

    Ioannis ...that sort of what I'm doing - but rather than a tranny I'm using a mosfet (no filtering either...since the end result is visual, and the eye is only good for about 25Hz ....my pwm is about 16khz...so I didn't see the need?)
    Last edited by HankMcSpank; - 28th February 2012 at 10:46.

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