|
|
#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������Ҫ�ĸ���ѹ�����ο�adc�IJο���ѹΪ���� */ 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); }
//���Զ�ȡadc�ɼ��ĵ�ѹֵ
void ADCPA2Init() { 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_A2, &y);
//������Ƶ�Ժ�Tadclk=1/(PCLK/4)Լ����0.083us
x.CLKS = ADC_CLKS_PCLK; x.CLKDIV = ADC_CLKDIV_1_32; /* ADCʱ��ԴԤ��Ƶ */
//�ɼ�����ģ����*3.3/4096=���ڵĵ�ѹ
x.VREF_SEL = ADC_VREF_SEL_0; /* �ڲ��ο���ѹ2.048v,�������ڲ��ο���ѹΪ���� */ x.VREFP = ADC_VREFP_VDD; /* ѡ��оƬ�Ĺ�����ѹVDD������������adc������Ҫ�ĸ���ѹ�����ο�adc�IJο���ѹΪ���� */ x.VREFN = ADC_VREFN_VSS; /* �����ο���ѹѡ�� */ 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_pa2_adc_value(void) { volatile uint32_t pa2_adc_val = 0; ADCPA2Init(); ADC_SoftStart(); //����ת��
while (ADC_GetConvStatus() != RESET) ; pa2_adc_val = ADC_GetConvValue(); ADC_SoftStop(); printf("%d\r\n", pa2_adc_val); printf("pa2_val:%lf\r\n", pa2_adc_val * 3.3 / 4096); }
void ADCPB8Init() { 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_B8, &y);
//������Ƶ�Ժ�Tadclk=1/(PCLK/4)Լ����0.083us
x.CLKS = ADC_CLKS_PCLK; x.CLKDIV = ADC_CLKDIV_1_32; /* ADCʱ��ԴԤ��Ƶ */
//�ɼ�����ģ����*3.3/4096=���ڵĵ�ѹ
x.VREF_SEL = ADC_VREF_SEL_0; /* �ڲ��ο���ѹ2.048v,�������ڲ��ο���ѹΪ���� */ x.VREFP = ADC_VREFP_VDD; /* ѡ��оƬ�Ĺ�����ѹVDD������������adc������Ҫ�ĸ���ѹ�����ο�adc�IJο���ѹΪ���� */ x.VREFN = ADC_VREFN_VSS; /* �����ο���ѹѡ�� */ x.CHS = ADC_CHS_AIN3; 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_pb8_adc_value(void) { volatile uint32_t pb8_adc_val = 0; ADCPB8Init(); ADC_SoftStart(); //����ת��
while (ADC_GetConvStatus() != RESET) ; pb8_adc_val = ADC_GetConvValue(); ADC_SoftStop(); printf("%d\r\n", pb8_adc_val); printf("pb8_val:%lf\r\n", pb8_adc_val * 3.3 / 4096); }
void ADCPB9Init() { 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);
//������Ƶ�Ժ�Tadclk=1/(PCLK/32)
x.CLKS = ADC_CLKS_PCLK; x.CLKDIV = ADC_CLKDIV_1_32; /* ADCʱ��ԴԤ��Ƶ */
//�ɼ�����ģ����*3.3/4096=���ڵĵ�ѹ
x.VREF_SEL = ADC_VREF_SEL_0; /* �ڲ��ο���ѹ2.048v,�������ڲ��ο���ѹΪ���� */ x.VREFP = ADC_VREFP_VDD; /* ѡ��оƬ�Ĺ�����ѹVDD������������adc������Ҫ�ĸ���ѹ�����ο�adc�IJο���ѹΪ���� */ 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_pb9_adc_value(void) { volatile uint32_t pb9_adc_val = 0; ADCPB9Init(); ADC_SoftStart(); //����ת��
while (ADC_GetConvStatus() != RESET) ; pb9_adc_val = ADC_GetConvValue(); ADC_SoftStop(); printf("%d\r\n", pb9_adc_val); printf("pb9_val:%lf\r\n", pb9_adc_val * 3.3 / 4096); }
void try_adc_gather(void) { static uint32_t adc_ticket = 0; // static uint32_t adc_ticket_count = 0;
if (port_haspassedms(adc_ticket) > 1000) { // adc_ticket_count++;
adc_ticket = get_sys_ticket(); // if (adc_ticket_count < 5) {
get_pb8_adc_value(); get_pa2_adc_value(); get_pb9_adc_value(); // }
// get_adc_value();
// if (adc_ticket_count >= 5) {
// if (adc_ticket_count == 10) {
// adc_ticket_count = 0;
// }
// ADC_Disable();
// get_pa2_adc_value();
// }
} }
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); printf("voltage:%lf\r\n", (s_adc[i].adc_just_now_gather_val) * 3.3 / 4096); } }
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);
// }
}
|