Ds1820 -> pid -> pwm


Closed Thread
Results 1 to 24 of 24

Hybrid View

  1. #1
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by malc-c View Post
    Well originally we had 4 PID loops running on a 16F877A with a 20Mhz Xtal so I guess the answer to your question is yes !

    As most of your project has already been provided in the sample code in one of your links, there is little work required on your behalf... however I would suggest you didn't rip off the code from that thread and claim it as your own when you submit your project for assestment. This wold be plagerisum (?)

    Hi;

    Thanks for the answer;

    I don't intend to suggest to my teacher that the code is mine. I need to do a report, and i have to mention where i get the source code and all other things, like images, texts..... My teacher is also a user of this fórum.
    The meaning of the project is to unsderstand the funcionality of a PID controller, and see the response of the PID by changing the Kp, Ki, Kd variables.

    If i complete the project, it's my intention to post here as open source!!!

    Hope i can count with your help, i will make the schematic and them post here!!

    Should i use a solid state relay to control de Heater Resistor or a Triac??

    Thanks once again!
    Thanks and Regards;
    Gadelhas

  2. #2
    Join Date
    May 2008
    Location
    Italy
    Posts
    825


    Did you find this post helpful? Yes | No

    Default

    ....The PID wiil work on an Aquarius Water heating process....
    ...The meaning of the project is to unsderstand the funcionality of a PID controller, and see the response of the PID by changing the Kp, Ki, Kd variables.
    I strongly suggest you to remove the fish before experimenting with Kp, Ki, Kd variables.

    Cheers

    Al.
    All progress began with an idea

  3. #3
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Talking

    Quote Originally Posted by aratti View Post
    I strongly suggest you to remove the fish before experimenting with Kp, Ki, Kd variables.

    Cheers

    Al.
    I think it's better too....

    Thanks
    Thanks and Regards;
    Gadelhas

  4. #4
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Good advice Al

    @gadelhas
    Most of the code in the PID thermostat thread was written by Darrel and Henrik, and contains a means of tuning the values you mention. Later this evening I'll go back through the early versions of the code I have for a single PID channel that can be configured via a PC running Hyperterminal and communicating via the serial port. I'll zip it up and attach that to the post. You can then experiment with the values and compose your report

  5. #5
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default

    Hi,
    What you want to do is very much doable with pretty much any PIC, a 16F877 will be plenty. Make sure you read thru the complete PID filter thread (if you haven't already) as it covers several things - and provides an updated version of the PID filter in post #57.

    The easiest way is to use a solid state relay as it isolates the load from the PIC and is easy to drive (it's basically just a LED). But to give a more detailed answer we'd need to know if the heater is AC and you by PWM really mean phase angle control. Or if it's DC and you intend to use the CCP-module in the PIC to produce a PWM signal - or (if it's either AC or DC) you intend to create a slow speed PWM with a period of several seconds or longer (I beleive this is what Malcolm did) where the fact that a triac or solid state relay for AC doesn't switch off until next zero crossing doesn't matter.

    /Henrik.

  6. #6
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by HenrikOlsson View Post

    The easiest way is to use a solid state relay as it isolates the load from the PIC and is easy to drive (it's basically just a LED). But to give a more detailed answer we'd need to know if the heater is AC and you by PWM really mean phase angle control. Or if it's DC and you intend to use the CCP-module in the PIC to produce a PWM signal - or (if it's either AC or DC) you intend to create a slow speed PWM with a period of several seconds or longer (I beleive this is what Malcolm did) where the fact that a triac or solid state relay for AC doesn't switch off until next zero crossing doesn't matter.

    /Henrik.
    I agree, an SSR is the simplest way to interface the output from a PIC to mains device. In the development of the thermostat project I'm now using zero-crossin opto-triac isolators to drive 16A triacs, but the original prototype used 4A SSR.

    As Henrik stated, my thermostat project uses low speed pwm to apply power to the heaters, the result is that the heaters remain at a nice stable temperature rather than the normal method of heating which results in large temperature swings

    Here's an example of the frequency

    Last edited by malc-c; - 11th October 2010 at 21:55. Reason: added video

  7. #7
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default

    Hi Again, and thanks for all of your answers!!

    Here is my 1º schematic of the PID Controller. As i say in my revious post, the Buttons, is to set the SetPoint, and change the Ki, Kp, Kd, variables.




    malc-c
    Good advice Al

    @gadelhas
    Most of the code in the PID thermostat thread was written by Darrel and Henrik, and contains a means of tuning the values you mention. Later this evening I'll go back through the early versions of the code I have for a single PID channel that can be configured via a PC running Hyperterminal and communicating via the serial port. I'll zip it up and attach that to the post. You can then experiment with the values and compose your report
    @ malc-c , if possible put the code here as you had mension. I would appreciate.

    @ HenrikOlsson, I'm reading and trying to understand your PID routine, i will post some questions soon about it, i have some questions!!
    The Heater resistor that i have is 220V AC, i think it's better to do, like malc-c did, with a Solid State Relay, and low speed PWM.

    @ malc-c Again. I see your video, and i think the result its really great. If you change the Kp, Ki, Kd, variables, do you see any change to the process? Like, more slow/ fast to achive the SetPoint, for instance?

    Thanks once again for everything.
    Hope you can understand my english, sorry for all the errors!
    Thanks and Regards;
    Gadelhas

  8. #8
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by gadelhas View Post

    I don't intend to suggest to my teacher that the code is mine. I need to do a report, and i have to mention where i get the source code and all other things, like images, texts..... My teacher is also a user of this fórum.
    Quote Originally Posted by aratti View Post
    In this case I will expect from him to challenge the highest performace he could think of.
    He will be a tomorrow electronic designer and he will have to face an extremely aggressive global market, so I do expect from him something more than "something that will likely work just fine"


    Al.
    Do we have teacher and pupil here ???

  9. #9
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default

    Hi Al,
    I believe that creating a product that serves its purpose without making it more complicated than it needs to be is key for an electronic designer, today and in the future.

    Going by the project description in the first post (ie temperature control (with PID) of a fish tank) I do beleive that low frequency PWM will work just as fine as a phase angle control but will be easier to implement, produce less electrical interference, require less parts and be easier to build - and it'll work on 50 and 60Hz mains without paying special attention. That's good product design in my book but I don't work as an electronics designer, I don't have a degree and I never went to university so what the heck do I know.

    If the students gets assessed by what they CAN (possibly) create then by all means, throw everything you got at it. Phase angle control, datalogging, GLCD with trend charts, TCP/IP interface, you name it. But I hope they gets assessed by their abillity to indentify the real needs to solve the problem at hand and then design a product that works - properly of course.

    I DO agree that the correct method should be used. If phase angle control in this application offers benefits that justifies the extra complexity then it IS the correct choice.

    Well, that's my view on it. 10-4

    Sincerely,
    /Henrik.

  10. #10
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default

    Hi Again Everyone, and once again thanks for all of your answers to the thread!

    I can only come to here at late night because i work during the day, and study at night, so sorry for only now answer to the thread!

    @malc-c
    To be honest you could use the code attached to my first post in the thermostat thread http://www.picbasic.co.uk/forum/showthread.php?t=12712
    You would need to build / breadboard your hardware to match that used in the included hardware file.
    I Allready have that code, however this code don't permite changing the variables with hiperterminal like you said, can you give me the one that does?

    Do we have teacher and pupil here ???
    Yes, my teacher usualy comes to here and MiKroelektronika forum, however he is more a Assembler fan!!!

    From memory, changing the values altered things like the amount of over-shoot of the set point, the range at which the output started pulsing, and the length of pulse. The advantage with the code that Darrel and Henrick had put together was that using a serial cable and Hyperterm I was able to change the values via the PC and see what effect it had on my test rig which comprised of a heater in a wooden box with the sensor 6" below a ceramic heater. Over several weeks the values were adjusted and tuned until the temperature set point either maintained or was within half a degree either side (as you can see by the video - in the real environment it's almost spot on)
    That's exactly what i wont, to see the response of the system, by changing the variables, that is the real porpose of the work!!!

    @aratti
    I know that the phase angle control it's much better to control AC charges, however, since it's slow speed PWM, because the system is slow, i think, that i have other advantages, like Henrik said! I have PID controllers on the University that i can use, however my teacher made me this challenge, and i accepted!
    Please don't judge me wrong, if i have the time, believe me that i would do the phase angle control, and I will put a GLCD to show the curves of the system response, but in the meantime i need to understand the PID, put it to work, and them improve the whole system, if i've got the time! This is not an excuse, but i work, i study and in 3 months my baby will be born, however like i said this is not a excuse. I really appreciate your opinion!

    @HenrikOlsson
    Why to you have the "pid_I_Clamp" and "pid_Out_Clamp"i'm not understanding the meaning of this variables?

    Thanks all for all your support!
    Thanks and Regards;
    Gadelhas

  11. #11
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default

    Hi Gadelhas,
    I've explained the purpose and use of both of those variables in the original thread but I'll try again.

    pid_I_Clamp limits the amount of "power" that the integral term of the PID-filter is allowed to contribute with to the total output. When doing your "PID homework" you'll come across the term windup, the pid_I_Clamp provides a way to prevent that.

    pid_Out_Clamp can be used to limit the total output of the filter. For example, if you your PWM generator has a resolution of 8 bits there's no need (and can possibly even be bad) for the output value to go above 255. The pid_Out_Clamp allows you to specify the maximum "output swing" of the regulator. Note that if you set it to 255 it can swing +/-255, if your system doesn't accept negative drive you need to take care of that "outside" of the filter.

    I hope that answers your question.

    /Henrik.

  12. #12
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by gadelhas View Post
    @malc-c

    I Allready have that code, however this code don't permite changing the variables with hiperterminal like you said, can you give me the one that does?
    I'll configure the EasyPIC5 board for use with a 16F877A and 20Mhz crystal and try the code, probably have to be tomorrow afternoon now as I won't be home from work until late. But I'm sure it does allow you to change and set the values of PID etc as it contains the code to do so (snippet attached)

    Code:
    ;----[handle incoming serial Terminal data]---------------------------------
    Term_RX:
        HSERIN [Char]
        SELECT CASE Char
            CASE "R","r"   ' Refresh
                GOSUB TerminalMenu
            CASE "S","s"   ' Enter Setpoint
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter SetPoint ... (340=34.0",$F8,"): "]
                HSERIN [DEC SetPoints(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_SetPoint1,EE_SetPoint2, _
                                     EE_SetPoint3,EE_SetPoint4],Bvar
                WRITE Bvar, WORD SetPoints(EditChannel)
            CASE "P","p"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter P term as HEX4 ... : "]
                HSERIN [HEX4 pid_Kp(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_Kp1,EE_pid_Kp2, _
                                     EE_pid_Kp3,EE_pid_Kp4],Bvar
                WRITE Bvar, WORD pid_Kp(EditChannel)
            
            CASE "I","i"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter I term as HEX4 ... : "]
                HSERIN [HEX4 pid_Ki(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_Ki1,EE_pid_Ki2, _
                                     EE_pid_Ki3,EE_pid_Ki4],Bvar
                WRITE Bvar, WORD pid_Ki(EditChannel)
            
            CASE "D","d"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter D term as HEX4 ... : "]
                HSERIN [HEX4 pid_Kd(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_Kd1,EE_pid_Kd2, _
                                     EE_pid_Kd3,EE_pid_Kd4],Bvar
                WRITE Bvar, WORD pid_Kd(EditChannel)
            
            CASE "T","t"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter Ti term as DEC ... : "]
                HSERIN [DEC pid_Ti(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_Ti1,EE_pid_Ti2, _
                                     EE_pid_Ti3,EE_pid_Ti4],Bvar
                WRITE Bvar, pid_Ti(EditChannel)
    
            CASE "C","c"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter I term Clamp as DEC ... : "]
                HSERIN [DEC pid_I_Clamp(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_I_Clamp1,EE_pid_I_Clamp2, _
                                     EE_pid_I_Clamp3,EE_pid_I_Clamp4],Bvar
                WRITE Bvar, WORD pid_I_Clamp(EditChannel)
             
            CASE "O","o"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Enter Output Clamp as DEC ... : "]
                HSERIN [DEC pid_Out_Clamp(EditChannel)]
                GOSUB  TerminalMenu
                LOOKUP2 EditChannel,[EE_pid_Out_Clamp1,EE_pid_Out_Clamp2, _
                                     EE_pid_Out_Clamp3,EE_pid_Out_Clamp4],Bvar
                WRITE Bvar, WORD pid_Out_Clamp(EditChannel)
            CASE "M","m"
                X=1 : Y=22 : GOSUB MoveCursor
                HSEROUT ["Manual Mode not available.      "]
    
            CASE "1","2","3","4"                       ; select channel
                IF EditChannel != Char -49 THEN
                    GOSUB ClearBox
                    EditChannel = Char -49
                    GOSUB DrawBox
                ENDIF
            CASE ELSE
                HSEROUT [7]     ; bad key, send Bell
        END SELECT
    RETURN
    It might not work with the version in MCS, but works fine with the version that came with windows XP - maybe google for a similar application

    You should get something like

    Last edited by malc-c; - 13th October 2010 at 13:02.

  13. #13
    Join Date
    Aug 2008
    Location
    Portugal
    Posts
    240


    Did you find this post helpful? Yes | No

    Default

    Hi;
    @Henrik;

    Thanks for the answer, i understand now what it means! I will have some more questions, so please don't be mad with me!!

    @malc-c
    Thanks for the code, but i'm not understanding how this piece of code works with the other. Where is the "terminalMenu", "clearBox", "Movecursor" routines?
    When i post the schematic of the hardware, was according to my EasyPic6 Board. I will build the circuit and try the codes in the next Saturday. I think EasyPic5 has the same conections that EasyPic6.
    Please if you try the code posted, tell me the results, if possible, of course. Thanks again!
    Thanks and Regards;
    Gadelhas

  14. #14
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,612


    Did you find this post helpful? Yes | No

    Default

    I will have some more questions, so please don't be mad with me
    Don't worry, I'll try to answer/explain what I can.

  15. #15
    malc-c's Avatar
    malc-c Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by gadelhas View Post

    @malc-c
    Thanks for the code, but i'm not understanding how this piece of code works with the other. Where is the "terminalMenu", "clearBox", "Movecursor" routines?
    When i post the schematic of the hardware, was according to my EasyPic6 Board. I will build the circuit and try the codes in the next Saturday. I think EasyPic5 has the same conections that EasyPic6.
    Please if you try the code posted, tell me the results, if possible, of course. Thanks again!
    The code I pasted above was a snippet - It was taken from the zip file attached to the 1st post in my thermostat post you linked to above.

Members who have read this thread : 1

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