CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

ADC_Value vs o\p display on 16*2 LCD
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

ADC_Value vs o\p display on 16*2 LCD
PostPosted: Sun Jan 01, 2012 12:19 pm     Reply with quote

Now I'm using like this:
Code:

/*        16F676 Configuration   
         

          O = Output, I = Input
                                                      2.2K
                    _________   |-----------------^^^--
              Vdd   | 1  14 |  Vss                     | 4.7K
  (O)  L1 <-- RA5   | 2  13 |  AN0 <-- I\P V_Sense (I)--^^^--<|-- up to 15 V AC
  (O)  L2 <-- RA4   | 3  12 |  AN1 <-- O\P Volt_Sense (I)   1N4007
  (I) SW1 --> MCLR  | 4  11 |  RA2 --> NC  (O)
  (O) RS  <-- RC5   | 5  10 |  RC0 --> DB4 (O)
  (O)  E  <-- RC4   | 6   9 |  RC1 --> DB5 (O)
  (O) DB7 <-- RC3   | 7   8 |  RC2 --> DB6 (O)
                    ---------
*/

/*****************************************************************************
  Function ProcessMains
  Reads ADC_Value and etc
 ****************************************************************************/

int ProcessMains(void)
{
   set_adc_channel(0); // Select AN0
      delay_ms(ADC_DELAY);          //Charge capacitor
         read_adc(ADC_START_ONLY);       //Do A/D conversion
   
         done == adc_done();
 
         while(!done) {
            done = adc_done();
         }

         temp_result += read_adc();          // Read A/D register .  Pin A0 in an input
      delay_ms(ADC_2TAD);               // Wait 2 TADs before doing another A/D conversion

   ADC_Value = temp_result / ADC_AVERAGE_COUNT;
   
   tlong = (int32)ADC_Value*500;    //Convert the result in millivolts
   tlong = tlong/1023;              // 0..1023 -> 0-5000mV
   volt = tlong;              // Extract volts (thousands of millivolts 250mv = 250volt

   }

 lcd_init(); 

     lcd_putc("\fVOLT =volt \n");
     lcd_putc("I\P Volt");

Now anybody clear me, Value volt which display on 16*2 LCD are RMS VALUE or peak to peak VALUE?

Quote:
volt = tlong; // Extract volts (thousands of millivolts 250mv = 250volt

_________________
sahu
asmboy



Joined: 20 Nov 2007
Posts: 2128
Location: albany ny

View user's profile Send private message AIM Address

PostPosted: Sun Jan 01, 2012 12:33 pm     Reply with quote

Quote:

up to 15 V AC


is that for real??? up to 15v AC thru a 4.7 k resistor ??

how are you expecting the PIC to deal with that signal?
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Sun Jan 01, 2012 12:53 pm     Reply with quote

asmboy wrote:
Quote:

up to 15 V AC


is that for real??? up to 15v AC thru a 4.7 k resistor ??

how are you expecting the PIC to deal with that signal?

yes its real via step down tx.
pls right now ignore any hardware mistake.
clear me only ---
Value volt which display on 16*2 LCD are RMS VALUE or peak to peak VALUE?
_________________
sahu
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Sun Jan 01, 2012 3:46 pm     Reply with quote

You will get the instantaneous voltage at the time the A/D samples. If you synchronize your A/D readings with the AC cycle you can get Peak readings. If you get the + peak and the - peak you can calculate the peak to peak value. To synchronize the PIC you usually use a "Zero Crossing Detector" circuit.

To get RMS you need to take many samples each cycle, then Square them, calculate the Mean over some time period, then take the square Root.

Note that the PIC A/D can not read negative instantaneous voltages. Your 4.7K & 2.2K divider will scale the positive voltages, but the negative ones will read as zero. As shown the negative 15 AC cycle would put 3mA into the PIC protection diode which is not a good idea.
_________________
The search for better is endless. Instead simply find very good and get the job done.
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Mon Jan 02, 2012 10:54 am     Reply with quote

Please anybody sages me- how I can find true RMS value ?
_________________
sahu
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Jan 02, 2012 11:18 am     Reply with quote

SherpaDoug has very nicely explained the procedure for you.

Since only you control the design/build of the hardware, it's up to you to create the code you need. We can only offer limited help, not actual code as what we create will only work on our equipment.
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Mon Jan 02, 2012 12:46 pm     Reply with quote

temtronic wrote:
SherpaDoug has very nicely explained the procedure for you.

Since only you control the design/build of the hardware, it's up to you to create the code you need. We can only offer limited help, not actual code as what we create will only work on our equipment.


oho oho no sir not need me complete code . need only
correction for this code
Code:
 set_adc_channel(0); // Select AN0
      delay_ms(ADC_DELAY);          //Charge capacitor
         read_adc(ADC_START_ONLY);       //Do A/D conversion
   
         done == adc_done();
 
         while(!done) {
            done = adc_done();
         }

         temp_result += read_adc();          // Read A/D register .  Pin A0 in an input
      delay_ms(ADC_2TAD);               // Wait 2 TADs before doing another A/D conversion

   ADC_Value = temp_result / ADC_AVERAGE_COUNT;
   
   tlong = (int32)ADC_Value*500;    //Convert the result in millivolts
   tlong = tlong/1023;              // 0..1023 -> 0-5000mV
   volt = tlong;              // Extract volts (thousands of millivolts 250mv = 250volt

which give Mean OR RMS VALUE .

sorry my bad English
_________________
sahu
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Jan 02, 2012 12:50 pm     Reply with quote

ADC_value is already an average or mean value.

from your code...
ADC_Value = temp_result / ADC_AVERAGE_COUNT;


You cannot get RMS value as you are not sampling the input AC voltage correctly. You MUST do all of what SherpaDoug has said before if you want RMS value.
Five easy steps to sucess.
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Mon Jan 02, 2012 5:23 pm     Reply with quote

To get RMS (Root of the Mean Square) you must square the values BEFORE you average them. How long you average for depends on how fast a response you need versus noise immunity. You also want to average over complete cycles. Many meters that measure 50 or 60Hz use 100ms. That is 5 complete cycles at 50Hz or 6 at 60Hz. Then you take the square root.

Of course you will also have to alter your hardware to accurately read the negative half of the AC cycle.
_________________
The search for better is endless. Instead simply find very good and get the job done.
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 9:41 am     Reply with quote

now today i found 1 new problem ....
problem as
Code:
ADC_Value = temp_result / ADC_AVERAGE_COUNT;
     
    tlong = (int32)ADC_Value*500;    //Convert the result in millivolts
    tlong = tlong/1023;              // 0..1023 -> 0-5000mV
    volt = tlong;              // Extract volts (thousands of millivolts 250mv = 250volt

    }

  lcd_init(); 

      lcd_putc("\fVOLT = volt \n");
      lcd_putc("I\P Volt");

volt is a numeric ,but lcd display volt word .

I'm use flex_lcd.c as lcd driver .

now clear me where i wrong ?
_________________
sahu
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 10:08 am     Reply with quote

Read a book on C?.....
You are sending the string 'VOLT = volt', which is what will be displayed.....

Look in the printf manual, in particular at the '%' operator, and it's formats.

Best Wishes
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 10:17 am     Reply with quote

Ttelmah wrote:
Read a book on C?.....
You are sending the string 'VOLT = volt', which is what will be displayed.....

Look in the printf manual, in particular at the '%' operator, and it's formats.

Best Wishes

it is right
Code:
 LCD_PutChar("INPUT= "%ld ",volt");
?
?
_________________
sahu
temtronic



Joined: 01 Jul 2010
Posts: 9229
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 10:56 am     Reply with quote

While your project is open, press F11 to access the CCS C Onscreen HELP files !!

OR

LOOK at any of the examples that CCS kindly supplies to SHOW you HOW to use this compiler.


What you need to know is given there.
sahu77



Joined: 08 Sep 2011
Posts: 202

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 11:01 am     Reply with quote

temtronic wrote:
LOOK at any of the examples that CCS kindly supplies to SHOW you HOW to use this compiler.
What you need to know is given there.

i was also try it but not found my ans .
_________________
sahu
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Sat Jan 07, 2012 12:22 pm     Reply with quote

You should be using lcd_putc in a printf statement.

The CCS Example file EX_LCDTH.C shows how it should be done..

There is another example in the current manual on page 216 under printf
_________________
Google and Forum Search are some of your best tools!!!!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group