本帖最后由 zhjb1 于 2024-12-16 17:54 编辑
四、ADC 首先做ADC测试,在厂家给足了实例,测试起来还是非常轻松的,只需要将前一个测试的程序加上心得功能测试就行了,下边以软件触发测试ADC为例进行。 1. 打开上次LCD驱显的工程,同时将G32A1xxx_SDK_V1.1\Examples\G32A1465\ADC\ ADC_SoftwareConversion\Source目录下的main.c也打开(注意使用打开文件的方式打开,不是添加!) 2. 打开ADC的main.c在前边多了#include "g32a1xxx_adc.h",拷贝到本main.c的相同位置 3. 他有几个变量定义和声明,拷贝过来 #define ADC_INSTANCE (0U) static __IO uint32_t g_timingDelay; float g_adcMaxValue = 4096; float g_adcDifference = 3.3f; float adcValue; int k=0; uint32_t js=0; 上边几个是拷贝过来的,原来的float adcValue;定义在main里面,我们需要送LCD显示,所以变成全局变量。 4. 将ADC的main中的几个函数定义拷贝过来: //Systick Define void SysTick_Init(void){ //Update System Core Clock info SystemCoreClockUpdate(); //SystemFrequency / 1000 = 1ms if (SysTick_Config(SystemCoreClock / 1000)){ //Capture error while (1); } } void SysTick_Delay_ms(__IO uint32_t nTime){g_timingDelay = nTime;while (g_timingDelay != 0);} void TimingDelay_Decrement(void){if (g_timingDelay != 0){g_timingDelay--;}} //ADC Define void ADC_init(void){ ADC_CONV_CFG_T tempAdcConvCfg0; ADC_AVG_CFG_T tempAdcAverCfg0; ADC_CALIBRATION_T tempAdcCalibration0; //Reset adc module ADC_Reset(ADC_INSTANCE); //Call default configuration ADC_ConfigConverterStruct(&tempAdcConvCfg0); tempAdcConvCfg0.clockDivision = ADC_CLK_DIVISION_4; tempAdcConvCfg0.resolution = ADC_RESOLUTION_RATIO_12BIT; //Call default configuration ADC_ConfigHwAverageStruct(&tempAdcAverCfg0); tempAdcAverCfg0.hwAvgEnable = true; tempAdcAverCfg0.hwAverage = ADC_HW_AVERAGE_32; //Call default configuration ADC_ConfigUserCalibrationStruct(&tempAdcCalibration0); tempAdcCalibration0.userGain = ADC_DEFAULT_SAMPLE_TIME; tempAdcCalibration0.userOffset = 20000u; //Set software pre triggering ADC_SetSwPretrigger(ADC_INSTANCE,ADC_SW_PRE_TRIGGER_0); //Initialize ADC based on configuration values ADC_ConfigConverter(ADC_INSTANCE,&tempAdcConvCfg0); //Initialize ADC hardware averaging function based on configuration values ADC_ConfigHwAverage(ADC_INSTANCE,&tempAdcAverCfg0); //Enable calibration function ADC_ConfigUserCalibration(ADC_INSTANCE,&tempAdcCalibration0); //Verify ADC ADC_AutoCalibration(ADC_INSTANCE); } //Read ADC value None ADC value float ADC_readValue(void){ uint16_t partAdcValue; ADC_CHAN_CONFIG_T tempAdcChanCfg0; //Call default configuration ADC_ConfigChanStruct(&tempAdcChanCfg0); tempAdcChanCfg0.interruptEnable = false; tempAdcChanCfg0.channel = ADC_INPUT_CHANNEL_EXT12; //Trigger using software ADC_ConfigChan(ADC_INSTANCE, 0u, &tempAdcChanCfg0); //waiting for conversion to complete ADC_WaitConvDone(ADC_INSTANCE); //Obtain conversion results ADC_ReadChanResult(ADC_INSTANCE, 0u, &partAdcValue); return (float)partAdcValue; } 这里有Systick的定义和延时函数,本例还用原来的,ADC的定义和启动一次ADC检测函数。 5. 更改主函数和LCD显示东西 在COM_INIT()后增加: ADC_init(); SysTick_Init(); 在while循环函数中增加: adcValue = ADC_readValue() / g_adcMaxValue * g_adcDifference; //Output ADC conversion value printf("ADC conversion voltage value = %fV\r\n",adcValue); 打开12864.h函数 增加: extern float adcValue; uint16_t adcx; 前者是main传过来的浮点ADC值,后一个是将浮点数转成数值,注意是1.xxxx的数值,在显示时需要分位并且乘以不同的10 倍以供显示(相当于左移多少位)。 6. 最后的结果,下边是上位机模拟串口数据显示,下边是LCD显示,数值不是同步的。视频还没有传上去,之后将连接做上。
|