Issues with a feedback loop.


Closed Thread
Results 1 to 3 of 3
  1. #1
    Join Date
    Feb 2004
    Location
    Michigan, USA
    Posts
    305

    Default Issues with a feedback loop.

    Having a thinking issue with the code below. For the most part it works but I know there is a problem with the way I'm getting the feedback to adjust the output. I need it to be adjustable by the push buttons, and hold at that level. At the moment it will run and settle at some random number first, then I can adjust it with the push buttons. I believe the problem is this:

    Code:
    if LEDCURRENT < setpoint then
        pwm_signal=pwm_signal+1
    It will try to get LEDCURRENT = SETPOINT even if SETPOINT = 0.
    Obviously when the circuit starts, LEDCURRENT = 0 but it reduces the PWM_SIGNAL by 1 which then means it goes to 65535 and counts down by 1 until LEDCURRENT = SETPOINT.

    SETPOINT and LEDCURRENT should be the same, so if I want 1A at the output, LEDCURRENT should read 100 and SETPOINT would equal 100.

    Code:
    include "modedefs.bas"
    
    
    Define OSC 48
    DEFINE LCD_DREG	PORTB       ' Set LCD Data port
    DEFINE LCD_DBIT	4           ' Set starting Data bit (0 or 4) if 4-bit bus
    DEFINE LCD_RSREG PORTB   ' Set LCD Register Select port
    DEFINE LCD_RSBIT 3     	' Set LCD Register Select bit
    DEFINE LCD_EREG	PORTB       ' Set LCD Enable port
    DEFINE LCD_EBIT	2           ' Set LCD Enable bit
    DEFINE LCD_BITS	4           ' Set LCD bus size (4 or 8 bits)
    DEFINE LCD_LINES 2       ' Set number of lines on LCD
    DEFINE LCD_COMMANDUS 2000' Set command delay time in us
    DEFINE LCD_DATAUS 50      ' Set data delay time in us
    DEFINE ADC_BITS 10
    DEFINE ADC_CLOCK 3
    DEFINE ADC_SAMPLEUS 50
    DEFINE CCP1_REG PORTC
    DEFINE CCP1_BIT 2
    ADCON1 = %00001011
    ADCON2 = %10000111
    
    
    TRISA = %00001111
    TRISB = %00000000
    TRISC = %00000011
    CMCON = 7
    PORTA.5 = 0
    
    
    
    
    high_duty var word
    low_duty var word
    PWM_SIGNAL VAR word
    
    
    LEDVOLT var word
    LEDCOUNT var word
    CURRENT var word
    LEDCURRENT var word
    LCUR0 var word
    LCUR1 var word
    
    
    SETPOINT var word  'Output current level in 0.1A increments (100 = 1A)
    
    
    tb0 VAR WORD
    tb1 VAR WORD
    tb2 VAR WORD
    
    
    LED0 var word
    LED1 var word
    LED2 var word
    
    
    LEDV0 var word
    LEDV1 var word
    
    
    IOUT VAR byte
    
    
    but_0 var porte.3
    but_1 var portc.0
    PWMDUTY var word
    PWMDISP var word
    
    
    'IOUT = 0
    PORTC.6 = 0
    
    
    Pause 1500
    PWM_SIGNAL = 0
    setpoint = 0
    
    
    test:
    'setpoint = 150
    CCP1CON = %00111100
    PR2 = 239
    high_duty=(PWM_SIGNAL>>2)        'high 6 bits in CCPR1L
          low_duty=(PWM_SIGNAL<<6)         'low two bits for CCP1CON
          'low_duty=(low_duty>>2)           'shift back to CCP1CON<5:4>
          low_duty.4=0                     'PWM configuration bit
          low_duty.5=1                     'PWM configuration bit
    CCPR1L=high_duty
    CCP1CON = $0C
    T2CON = 4
    
    
    
    
    if !but_0 then
            if SETPOINT>0 then
                SETPOINT=SETPOINT-1
            endif
        endif
        if !but_1 then
            if SETPOINT<150 then
                SETPOINT=SETPOINT+1
            endif
        endif 
    
    
    PWMDUTY = PWM_SIGNAL * 100
    PWMDISP = PWMDUTY / 1040
    
    
    if LEDCURRENT < setpoint then
        pwm_signal=pwm_signal+1
        if PWM_SIGNAL = 550 then
        PWM_SIGNAL = PWM_SIGNAL
    endif
    ENDIF
    if LEDCURRENT > setpoint then
        pwm_signal=pwm_signal-1
        IF PWM_SIGNAL = 0 then
        PWM_SIGNAL = PWM_SIGNAL
    endif
    ENDIF
    
    
    
    
    ADCIN 1, LEDCOUNT
    LEDVOLT = LEDCOUNT * 49 /90
    LEDV0 = LEDVOLT/10
    LEDV1 = LEDVOLT//100
    
    
    ADCIN 0, CURRENT
    LEDCURRENT = CURRENT * 49 /100 *2
    LCUR0 = LEDCURRENT/100
    LCUR1 = LEDCURRENT//1000
     
    'LCDOUT $FE,1,"PCB ",DEC2 tb0,".",DEC1 tb1,"C ", DEC2 PWMDISP, "%" 
    'LCDOUT $FE,$C0,"LED ",DEC2 LED0,".",DEC1 LED1,"C ", DEC4 PWM_SIGNAL
    
    
    PORTC.6 = 1
    pause 100
    PORTC.6 = 0
    pause 100
    LCDOUT $FE,1, "LED V ", DEC2 LEDV0, ".", DEC1 LEDV1,"V ", DEC2 PWMDISP, "%"
    LCDOUT $FE,$C0,"C", DEC1 LCUR0, ".", DEC2 LCUR1,"A ", dec4 current, " ", DEC4 PWM_SIGNAL
    
    
    goto test

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


    Did you find this post helpful? Yes | No

    Default Re: Issues with a feedback loop.

    Just replace the condition :

    If pwm_signal = 0 then
    Pwm_signal =Pwm_signal
    Endif

    With:

    If pwm_signal >1000 then pwm_signal = 0


    Cheers

    Al.
    All progress began with an idea

  3. #3
    Join Date
    Feb 2004
    Location
    Michigan, USA
    Posts
    305


    Did you find this post helpful? Yes | No

    Default Re: Issues with a feedback loop.

    Code:
    if !but_0 then
            if SETPOINT>0 then
                SETPOINT=SETPOINT-1
               endif
        endif
        if !but_1 then
            if SETPOINT<19 then
                SETPOINT=SETPOINT+1
            endif
        endif
    While this generally works, if you reduce SETPOINT to 0, when you let go of the button, SETPOINT increases to 1; how do I fix it so that it stays at 0?

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