You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.4 KiB
110 lines
3.4 KiB
#include "adc.h"
|
|
static adc_t s_adc[] = {
|
|
{.port = "A", .pin = 2},
|
|
{.port = "B", .pin = 8},
|
|
{.port = "B", .pin = 9},
|
|
};
|
|
/***********************************************************************************************************************
|
|
* =====================================================adc======================================================
|
|
**
|
|
***********************************************************************************************************************/
|
|
// uint16_t meanvalue;
|
|
adc_t adc = {0};
|
|
void ADCInit(uint8_t *port, uint8_t pin) {
|
|
// GPIO_PIN(A, 28);
|
|
ADC_InitStruType x;
|
|
GPIO_InitSettingType y;
|
|
y.Signal = GPIO_Pin_Signal_Analog; //模拟
|
|
y.Dir = GPIO_Direction_Input; //输入
|
|
y.Func = GPIO_Reuse_Func0;
|
|
//x.CHS设置adc采集的通道每个引脚对应一个通道
|
|
// GPIO_Init(GPIO_Pin_B9, &y);
|
|
if (pin == 2) {
|
|
GPIO_Init(GPIO_Pin_A2, &y);
|
|
x.CHS = ADC_CHS_AIN8;
|
|
printf("A4\r\n");
|
|
} else if (pin == 8) {
|
|
GPIO_Init(GPIO_Pin_B8, &y);
|
|
x.CHS = ADC_CHS_AIN3;
|
|
printf("B8\r\n");
|
|
} else if (pin == 9) {
|
|
GPIO_Init(GPIO_Pin_B9, &y);
|
|
x.CHS = ADC_CHS_AIN4;
|
|
printf("B9\r\n");
|
|
}
|
|
|
|
//经过分频以后Tadclk=1/(PCLK/4)约等于0.083us
|
|
x.CLKS = ADC_CLKS_PCLK;
|
|
x.CLKDIV = ADC_CLKDIV_1_4; /* ADC时钟源预分频 */
|
|
|
|
//采集到的模拟量*3.3/4096=现在的电压
|
|
|
|
x.VREF_SEL = ADC_VREF_SEL_0; /* 内部参考电压2.048v,设置内部参考电压为多少 */
|
|
x.VREFP = ADC_VREFP_VDD; /* 选择芯片的工作电压VDD,adc的参考电压为多少 */
|
|
x.VREFN = ADC_VREFN_VSS; /* 负向参考电压选择 */
|
|
// x.CHS = ADC_CHS_AIN4;
|
|
// x.CHS = ADC_CHS_AIN8;
|
|
x.SMPS = ADC_SMPS_SOFT; /* AD采样模式为软件控制 */
|
|
//采样时间st*2+1(个Tadclk)=1.743us
|
|
x.ST = 10; /* AD采样时间选择 */
|
|
x.BITSEL = ADC_BITSEL_12; /* AD分辨率12位 */
|
|
ADC_Init(&x);
|
|
}
|
|
|
|
void get_adc_value(void) {
|
|
uint16_t adc_value = 0;
|
|
for (int i = 0; i < 3; i++) {
|
|
ADCInit(s_adc[i].port, s_adc[i].pin);
|
|
ADC_SoftStart();
|
|
while (ADC_GetConvStatus() == SET)
|
|
; //正在转换
|
|
s_adc[i].adc_just_now_gather_val = ADC_GetConvValue();
|
|
ADC_SoftStop();
|
|
record_adc_gather_value(s_adc[i].adc_just_now_gather_val);
|
|
//printf("%d\r\n",s_adc[i].adc_just_now_gather_val);
|
|
}
|
|
}
|
|
|
|
void adc_loop_gather(void) {
|
|
static uint32_t adc_ticket = 0;
|
|
|
|
if (port_haspassedms(adc_ticket) > 500) {
|
|
adc_ticket = get_sys_ticket();
|
|
get_adc_value();
|
|
}
|
|
}
|
|
|
|
void record_adc_gather_value(uint16_t adc_value) {
|
|
/**
|
|
* @brief 记录adc各个通道采集到的数据
|
|
*
|
|
*/
|
|
for (int i = 0; i < 3; i++) {
|
|
s_adc[i].adc_value_buff[s_adc[i].adc_value_count++] = adc_value;
|
|
if (s_adc[i].adc_value_count == 5) {
|
|
s_adc[i].past_count_reached_five = true;
|
|
s_adc[i].adc_value_count = 0;
|
|
}
|
|
if (s_adc[i].past_count_reached_five == true) {
|
|
beg_average_value(s_adc[i].adc_value_buff);
|
|
}
|
|
}
|
|
}
|
|
|
|
void beg_average_value(uint16_t *adc_buff) {
|
|
uint16_t adc_average_value = 0;
|
|
uint32_t adc_sum_value = 0;
|
|
for (int i = 0; i < 5; i++) {
|
|
adc_sum_value += *adc_buff;
|
|
adc_buff++;
|
|
}
|
|
adc_average_value = adc_sum_value / 5;
|
|
if (adc_average_value <= 16 || adc.abnormal_state == true) {
|
|
adc.abnormal_state = true;
|
|
process_voltage_abnormal();
|
|
// printf("short out%d\r\n", adc_average_value); //短路
|
|
} else {
|
|
//例:adc_value=1700则电压=1700/4096=1.369
|
|
printf("adc_value_t%d\r\n", adc_average_value);
|
|
}
|
|
}
|