|
|
View previous topic :: View next topic |
Author |
Message |
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Wed Sep 19, 2007 6:42 am |
|
|
The setup of the ADC clock is outside the specifications. With your clock speed of 4Mhz set it to either DIV_8 or DIV_16. Now the ADC is delivering unreliable results.
Here is a cleaned up version of your code with all unused variables and declarations removed: Code: | #include <16f690.h>
#fuses XT,NOWDT,NOBROWNOUT
#DEVICE *=16 ADC=10
#use delay(clock=4000000)
//Redbox 27VDC @ 20A Charger
//Revision 1.0
//written on compiler version 3.245
//tested on compiler version 3.245
#define CS PIN_B7
//Arrays
const int16 Temp[42] =
{784, 775, 765, 755, 745, 735, 725, 714, 704, 693,
682, 671, 660, 649, 637, 626, 615, 603, 592, 581,
569, 558, 546, 535, 524, 512, 501, 490, 479, 468,
457, 446, 436, 425, 415, 405, 395, 385, 375, 365,
356, 346};
const int8 digipot[41] =
{255, 250, 244, 238, 232, 226, 220, 214, 208, 202,
196, 190, 184, 178, 172, 166, 154, 148, 142, 136,
130, 124, 118, 112, 106, 100, 94, 88, 82, 76,
70, 64, 58, 52, 46, 40, 34, 28, 22, 16,
0};
void main()
{
int8 a, pot;
int16 therm;
setup_adc_ports(sAN0|sAN1|sAN2);
setup_adc(ADC_CLOCK_DIV_8); // Changed DIV_2 to DIV_8 for clock speed compliance.
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_XMIT_L_TO_H | SPI_CLK_DIV_16);
//setup
output_high(CS);
therm=0;
pot=0;
do
{
set_adc_channel(2);
delay_us(75);
therm = read_adc();
if (therm > Temp[0])
{
pot = digipot[0];
}
else if (therm <= Temp[41])
{
pot = digipot[40];
}
else for (a = 0; a <= 40; a++)
{
if ( (therm <= Temp[a]) && (therm > Temp[a+1]) )
{
pot = digipot[a];
break; // Optimization: exit loop when found.
}
}
output_low(CS);
spi_write(0x11); //command byte
spi_write(pot); //data byte
output_high(CS);
delay_ms(500);
} while(1);
} |
Also note how the arrays are declared as const. This places the data in ROM and saves about 120 bytes of RAM.
If the above code is still not working then try to split the problem in smaller parts. Is it the ADC that's failing or is it the potentiometer?
A real time saver in debugging is to implement an rs232 output for debug messages on the PC. Then you can print the values read from the ADC and the value you are sending to the potentiometer. |
|
|
Ttelmah Guest
|
|
Posted: Wed Sep 19, 2007 7:33 am |
|
|
How are you actually 'testing' this?.
You say that you only have the test meter attached to the pot. This may be the problem.
Digital potentiometers, behave significantly differently from 'real' ones. If you apply a DVM, the result can be wildly 'skewed', if the test voltage takes the wiper outside the supply range. You need to ground the bottom terminal of the digipot, or attach it to a voltage inside the working range, and then ensure that the DVM, is applying a +ve test voltage to the wiper. If you look at the data sheet test setup, this is done exactly this way. The pot will behave abnormally, if this is not the case.
Best Wishes |
|
|
jfk1965
Joined: 21 Oct 2003 Posts: 58
|
|
Posted: Wed Sep 19, 2007 7:44 am |
|
|
Thankyou for all the help you are giving ckielstra.
I will test the code you have modified for me. One thing that makes me think that there is nothing wrong with the code as such is that when the pot gets stuck at 38K and I freeze spray the thermistor the data coming out of the PIC does change but the potentiometer doesn't change value.
I have sat and watched (with a scope)what the data should be when the pot is at 100K. When the pot is stuck I freeze spray the thermistor and the data comming out of the PIC changes to the 100K data but the digipot doesn't respond.
I have tried this on 3 different digipot chips now and they all do the same, I really don't now where the problem is.
OK now update I have tested the code you sent me and there is no change, it still does the same
I monitored the data coming out of the chip again and it definetly changes to set the pot to 100K but the pot just sits there at 38K and won't budge. If I reset the power whilst the thermistor is still cold it immediately jumps to 100K when power is restored.
Can I assume the code works now and that the problem lies with the digipot?
JFK |
|
|
jfk1965
Joined: 21 Oct 2003 Posts: 58
|
|
Posted: Wed Sep 19, 2007 8:01 am |
|
|
Ttelmah wrote: | How are you actually 'testing' this?.
You say that you only have the test meter attached to the pot. This may be the problem.
Digital potentiometers, behave significantly differently from 'real' ones. If you apply a DVM, the result can be wildly 'skewed', if the test voltage takes the wiper outside the supply range. You need to ground the bottom terminal of the digipot, or attach it to a voltage inside the working range, and then ensure that the DVM, is applying a +ve test voltage to the wiper. If you look at the data sheet test setup, this is done exactly this way. The pot will behave abnormally, if this is not the case.
Best Wishes |
Hi I have the digipot setup as per the test parameter diagriam in the datasheet. I'm measuring it by connecting the DVM between Ground and the wiper. I'll check the DVM for a positive test voltage.
JFK |
|
|
|
|
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
|