CH32V208W4路模擬量采集得到不正確的數(shù)據(jù)

使用ADC/Auto_Injection Demo,做了些修改, 發(fā)現(xiàn)無法讓4 ADC都正確工作,只有前面第一個是正確的,后面的都不正確,可以幫忙看看是哪里配置錯了嗎?


只修改了main.c? 修改后的代碼如下:

/********************************** (C) COPYRIGHT *******************************

?* File Name? ? ? ? ? : main.c

?* Author? ? ? ? ? ? ?: WCH

?* Version? ? ? ? ? ? : V1.0.0

?* Date? ? ? ? ? ? ? ?: 2021/06/06

?* Description? ? ? ? : Main program body.

?* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.

?* SPDX-License-Identifier: Apache-2.0

?*******************************************************************************/


/*

?*@Note

?自動注入模式例程:

?ADC通道1(PA1)-規(guī)則組通道,通道3(PA3)-注入組通道


*/


#include "debug.h"


s16 Calibrattion_Val = 0;


/*********************************************************************

?* @fn? ? ? ADC_Function_Init

?*

?* @brief? ?Initializes ADC collection.

?*

?* @return? none

?*/

#define GPIOGROUP GPIOC

#define EXTRA2 1

void ADC_Function_Init(void)

{

? ? ADC_InitTypeDef? ADC_InitStructure = {0};

? ? GPIO_InitTypeDef GPIO_InitStructure = {0};


? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

? ? RCC_ADCCLKConfig(RCC_PCLK2_Div8);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOGROUP, &GPIO_InitStructure);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOGROUP, &GPIO_InitStructure);

#ifdef EXTRA2

? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOGROUP, &GPIO_InitStructure);


? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

? ? GPIO_Init(GPIOGROUP, &GPIO_InitStructure);

#endif

? ? ADC_DeInit(ADC1);

? ? ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

? ? ADC_InitStructure.ADC_ScanConvMode = DISABLE;

? ? //ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

? ? ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

? ? ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

? ? ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

? ? ADC_InitStructure.ADC_NbrOfChannel = 1;

#ifdef EXTRA2

? ? ADC_InitStructure.ADC_NbrOfChannel = 1;

#endif

? ? ADC_Init(ADC1, &ADC_InitStructure);


? ? ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_28Cycles5);

? ? ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_28Cycles5);

? ? //ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_239Cycles5);

? ? //ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_239Cycles5);

#ifdef EXTRA2

? ? ADC_InjectedChannelConfig(ADC1, ADC_Channel_12, 2, ADC_SampleTime_239Cycles5);

? ? ADC_InjectedChannelConfig(ADC1, ADC_Channel_13, 3, ADC_SampleTime_239Cycles5);

#endif

? ? ADC_AutoInjectedConvCmd(ADC1, ENABLE);

? ? ADC_Cmd(ADC1, ENABLE);


? ? ADC_BufferCmd(ADC1, DISABLE); //disable buffer

? ? ADC_ResetCalibration(ADC1);

? ? while(ADC_GetResetCalibrationStatus(ADC1));

? ? ADC_StartCalibration(ADC1);

? ? while(ADC_GetCalibrationStatus(ADC1));

? ? Calibrattion_Val = Get_CalibrationValue(ADC1);


? ? ADC_BufferCmd(ADC1, ENABLE); //enable buffer

}


/*********************************************************************

?* @fn? ? ? Get_ADC_Val

?*

?* @brief? ?Returns ADCx conversion result data.

?*

?* @param? ?ch - ADC channel.

?*? ? ? ? ? ? ADC_Channel_0 - ADC Channel0 selected.

?*? ? ? ? ? ? ADC_Channel_1 - ADC Channel1 selected.

?*? ? ? ? ? ? ADC_Channel_2 - ADC Channel2 selected.

?*? ? ? ? ? ? ADC_Channel_3 - ADC Channel3 selected.

?*? ? ? ? ? ? ADC_Channel_4 - ADC Channel4 selected.

?*? ? ? ? ? ? ADC_Channel_5 - ADC Channel5 selected.

?*? ? ? ? ? ? ADC_Channel_6 - ADC Channel6 selected.

?*? ? ? ? ? ? ADC_Channel_7 - ADC Channel7 selected.

?*? ? ? ? ? ? ADC_Channel_8 - ADC Channel8 selected.

?*? ? ? ? ? ? ADC_Channel_9 - ADC Channel9 selected.

?*? ? ? ? ? ? ADC_Channel_10 - ADC Channel10 selected.

?*? ? ? ? ? ? ADC_Channel_11 - ADC Channel11 selected.

?*? ? ? ? ? ? ADC_Channel_12 - ADC Channel12 selected.

?*? ? ? ? ? ? ADC_Channel_13 - ADC Channel13 selected.

?*? ? ? ? ? ? ADC_Channel_14 - ADC Channel14 selected.

?*? ? ? ? ? ? ADC_Channel_15 - ADC Channel15 selected.

?*? ? ? ? ? ? ADC_Channel_16 - ADC Channel16 selected.

?*? ? ? ? ? ? ADC_Channel_17 - ADC Channel17 selected.

?*

?* @return? none

?*/

u16 Get_ADC_Val(u8 ch)

{

? ? u16 val;


? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);


? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));


? ? val = ADC_GetConversionValue(ADC1);


? ? return val;

}


/*********************************************************************

?* @fn? ? ? Get_ConversionVal

?*

?* @brief? ?Get Conversion Value.

?*

?* @param? ?val - Sampling value

?*

?* @return? val+Calibrattion_Val - Conversion Value.

?*/

u16 Get_ConversionVal(s16 val)

{

? ? if((val + Calibrattion_Val) < 0)

? ? ? ? return 0;

? ? if((Calibrattion_Val + val) > 4095||val==4095)

? ? ? ? return 4095;

? ? return (val + Calibrattion_Val);

}


/*********************************************************************

?* @fn? ? ? main

?*

?* @brief? ?Main program.

?*

?* @return? none

?*/

int main(void)

{

? ? u16 adc_val;

? ? u16 adc_jval;

? ? u16 adc_val_pc2;

? ? u16 adc_val_pc3;


? ? Delay_Init();

? ? USART_Printf_Init(115200);

? ? printf("SystemClk:%d\r\n", SystemCoreClock);


? ? ADC_Function_Init();

? ? printf("CalibrattionValue:%d\n", Calibrattion_Val);

? ? u16 t = 0;

? ? while(1)

? ? {

? ? ? ? ADC_SoftwareStartConvCmd(ADC1, ENABLE);

? ? ? ? while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

? ? ? ? adc_val = ADC_GetConversionValue(ADC1);

? ? ? ? adc_jval = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_1);

#ifdef EXTRA2

? ? ? ? adc_val_pc2 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_2);

? ? ? ? adc_val_pc3 = ADC_GetInjectedConversionValue(ADC1, ADC_InjectedChannel_3);

#endif

? ? ? ? Delay_Ms(500);

? ? ? ? t = Get_ConversionVal(adc_val);

? ? ? ? printf("PC0:%04d\r\n", t);

? ? ? ? printf("PC1:%04d\r\n", Get_ConversionVal(adc_jval));

#ifdef EXTRA2

? ? ? ? printf("PC2:%04d\r\n", Get_ConversionVal(adc_val_pc2));

? ? ? ? printf("PC3:%04d\r\n", Get_ConversionVal(adc_val_pc3));

#endif

? ? ? ? Delay_Ms(2);

? ? }

}


你好,定時器觸發(fā)注入組轉化例程可參考

icon_rar.gifadc,auto.rar



只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频