我用的是PIC18F26K83,我试图用NTCALUG02A103F测量温度。我计算了ADC输出和它们等于的温度。我已经创建了两个数组:一个用于ADC值,一个用于该ADC值的温度。在for循环中,我比较来自ADC的值和来自数组的值,如果我的ADC值小于数组值,它就会不断地减少数组元素,并最终得到258个ADC值,这是数组的最后一个元素。但是,在for循环中,它永远不会减少。即使我的ADC值是2000,它也不会继续。它被困在i=32了。以下是代码:
int i;
int temperature;
int temp_data;
int temp_ADC_array[34] = {259, 293, 332, 377, 428, 487, 555, 632, 720,
821, 934, 1062, 1203, 1360, 1531, 1715, 1910, 2113,
2320, 2528, 2731, 2926, 3108, 3274, 3422, 3552, 3663,
3756, 3833, 3895, 3945, 3983, 4013, 4036};
int temp_array[34] = {125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70,
65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,
5, 0, -5, -10, -15, -20, -25, -30, -35, -40};
void main() {
while (1) {
temp_data = ADC_READ(3);
for (i = 33; temp_data < temp_ADC_array[i]; i--) {
temperature = temp_array[i];
}
}编辑:这个for循环也不能工作:
for (i = 0; i < 34; i++) {
if (temp_data > temp_ADC_array[33 - i]) {
temperature = temp_array[33 - i];
break;
}
}编辑2:我用一个led测试它,我的电路上没有USB,所以我不能使用调试器。下面是我测试温度的方法:(我检查led的闪烁)
for(i; temperature>=0; temperature=temperature-10){
led=1;
delay_ms(1000);
led=0;
delay_ms(1000);
}
delay_ms(5000);发布于 2019-08-05 11:53:31
您在数组之外读取项-1等等,因为如果读取的值低于259,循环就永远不会停止。
例如,应该编写循环。
for(i=0; i<SIZE; i++)
{
if(temp_data < temp_ADC_array[SIZE-1-i])
{
found = true;
break;
}
}但是您也可以忘记这一点,因为您有一个排序的查找表,因此应该使用二进制搜索。它可能会大大加快一切,特别是因为16位比较不是PIC的强项。
如果使用"O log(n)“,您将得到5-6个最坏的情况,而不是34个。即使二进制搜索意味着一些指针杂耍开销,它仍然应该超过-执行您的线性搜索。在如此缓慢的CPU上,这将是非常重要的,特别是因为与ADC相关的代码往往对性能至关重要。
发布于 2019-08-05 11:26:00
这个回答只是重复我的评论。它的目的是使人们能够接受它作为一个答案,使人们立即看到这个问题已经解决。
我认为,当条件不再为真时,您的第一个循环可能会在指定温度之前停止。这意味着温度太早就有了值。不过,在我看来,第二个循环很好。
第一个循环是
void main() {
while (1) {
temp_data = ADC_READ(3);
for (i = 33; temp_data < temp_ADC_array[i]; i--) {
temperature = temp_array[i];
}
}它的问题是,当条件temp_data < temp_ADC_array[i]不再满足时,它就停止循环。因此,如果在i==0发生这种情况,温度仍然是temp_array[1]。
第二个循环是
for (i = 0; i < 34; i++) {
if (temp_data > temp_ADC_array[33 - i]) {
temperature = temp_array[33 - i];
break;
}
}它应该工作,因为它只有在指定正确的温度后才会中断。
https://stackoverflow.com/questions/57357428
复制相似问题