uint8_t select_adcRef(void) { uint16_t AD_value; uint8_t adc_ref[]={0xb1,0xb2,0xb3},X,u8_i,x_table[3]={1,2,4}; for(u8_i=0;u8_i<3;u8_i++) { FVRCON=adc_ref[u8_i]; //ref enable and ref set to 0xB1=1.024v,0xB2=2.048v,0xB3=4.096V while(!FVRCONbits.FVRRDY); //wait ref ready AD_value=adc_oneSample(); if(AD_value<1000) { X=x_table[u8_i]; break; } else if(u8_i==2) { X=x_table[2]; } } return X; }
时间: 2024-04-10 18:31:56 浏览: 65
这段代码是一个名为 `select_adcRef` 的函数,它的返回值类型是 `uint8_t`。函数中包含了一些变量的声明和赋值操作。在函数的开始部分定义了一个数组 `adc_ref`,并初始化为 `{0xb1,0xb2,0xb3}`。接下来进入一个 for 循环,循环变量 `u8_i` 初始化为 0,循环条件是 `u8_i<3`。在循环内部,函数会根据 `adc_ref[u8_i]` 的值设置 FVRCON 寄存器,并通过检查 FVRCONbits.FVRRDY 等待参考电压稳定。然后,函数会调用 `adc_oneSample` 函数获取 AD 值,并进行判断。如果 AD 值小于 1000,将变量 `X` 赋值为 `x_table[u8_i]`,并跳出循环。如果 `u8_i` 等于 2,将变量 `X` 赋值为 `x_table[2]`。最后,函数返回变量 `X` 的值。
相关问题
uint16_t ad_valu[8][5]; int16_t min[2][3], max[2][3]; uint16_t AD_L[8]; int16_t AD[8]; uint16_t AD_Round[8]; uint16_t AD_V[8][5]; uint16_t adsum[8]; uint16_t AD_sum[8]; uint16_t ad_valu1[8]; float sensor_to_one[8]; uint16_t max_v[8], min_v[8]; int16_t centre = 4000; int16_t chazhi[10]; int16_t move = 0; float Previous_Error[12]; float Previous_Error1[12]; void AD_nit() { adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); }只有5个电感怎么改
如果只有5个电感需要进行模拟信号转换,可以将AD_V数组的维度从[8][5]更改为[5],同时修改AD_nit函数中的ADC初始化部分,只初始化对应的5个通道。以下是修改后的代码示例:
```c
uint16_t ad_valu[8][5];
int16_t min[2][3], max[2][3];
uint16_t AD_L[8];
int16_t AD[8];
uint16_t AD_Round[8];
uint16_t AD_V[5];
uint16_t adsum[8];
uint16_t AD_sum[8];
uint16_t ad_valu1[8];
float sensor_to_one[8];
uint16_t max_v[8], min_v[8];
int16_t centre = 4000;
int16_t chazhi[10];
int16_t move = 0;
float Previous_Error[12];
float Previous_Error1[12];
void AD_nit()
{
adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
}
```
这样,AD_V数组的维度变为了[5],表示存储了5个电感的模拟信号转换结果。同时,AD_nit函数只初始化了5个对应的ADC通道。
#include "headfile.h" //#include "common.h" #include "math.h" //#include "cmath" extern unsigned int AD_L[8]; extern int AD[8]; extern int chazhi[10]; extern float sensor_to_one[8]; extern unsigned int max_v[8]; void AD_nit(); void Max_ADC(void); void Max_ADC_H(void); //void Read_AD(void); //void Read_AD_H(void); //void Analyse_ADC(void); void Find_Max(void); void Read_ADC(void); //float absf(int a,int b); int ADC_2(void); void Computer_Display2(void); uint16_t ad_valu[8][5]; int16_t min[2][3], max[2][3]; uint16_t AD_L[8]; int16_t AD[8]; uint16_t AD_Round[8]; uint16_t AD_V[5]; uint16_t adsum[8]; uint16_t AD_sum[8]; uint16_t ad_valu1[8]; float sensor_to_one[8]; uint16_t max_v[8], min_v[8]; int16_t centre = 4000; int16_t chazhi[10]; int16_t move = 0; float Previous_Error[12]; float Previous_Error1[12]; void AD_nit() { adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT); adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);为什么AD_L[8]会出现错误
AD_L[8]出现错误可能是因为它在代码中重复定义两次。在给变量命名时,要确保每个变量只被定义一次。在上述代码中,AD_L[8]被定义了两次。
首先,在头文件headfile.h中,我们可以看到以下代码:
```c
extern unsigned int AD_L[8];
```
这表示AD_L[8]是一个外部变量,在其他文件中已经定义过了。
然后,在当前文件中,我们又看到了以下代码:
```c
uint16_t AD_L[8];
```
这表示在当前文件中再次定义了AD_L[8],导致了重复定义的错误。
要解决这个问题,可以删除当前文件中的AD_L[8]的定义,只保留头文件中的声明即可。修改后的代码如下:
```c
#include "headfile.h"
//#include "common.h"
#include "math.h"
//#include "cmath"
extern unsigned int AD_L[8];
extern int AD[8];
extern int chazhi[10];
extern float sensor_to_one[8];
extern unsigned int max_v[8];
void AD_nit();
void Max_ADC(void);
void Max_ADC_H(void);
//void Read_AD(void);
//void Read_AD_H(void);
//void Analyse_ADC(void);
void Find_Max(void);
void Read_ADC(void);
//float absf(int a,int b);
int ADC_2(void);
void Computer_Display2(void);
uint16_t ad_valu[8][5];
int16_t min[2][3], max[2][3];
// uint16_t AD_L[8]; // 删除重复定义的行
int16_t AD[8];
uint16_t AD_Round[8];
uint16_t AD_V[5];
uint16_t adsum[8];
uint16_t AD_sum[8];
uint16_t ad_valu1[8];
float sensor_to_one[8];
uint16_t max_v[8], min_v[8];
int16_t centre = 4000;
int16_t chazhi[10];
int16_t move = 0;
float Previous_Error[12];
float Previous_Error1[12];
void AD_nit()
{
adc_init(ADC0, ADC_CH_10, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_11, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_12, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_13, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
adc_init(ADC0, ADC_CH_15, ADC_SAMPLETIME_55POINT5, ADC_RES_12BIT);
}
```
这样就修复了AD_L[8]重复定义的问题。
阅读全文