打印
[活动]

【G32A1465 测评】四、ADC测试

[复制链接]
62|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2024-12-16 17:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
AD, ADC, dc, AI, BSP
本帖最后由 zhjb1 于 2024-12-16 17:54 编辑

四、ADC
首先做ADC测试,在厂家给足了实例,测试起来还是非常轻松的,只需要将前一个测试的程序加上心得功能测试就行了,下边以软件触发测试ADC为例进行。
1. 打开上次LCD驱显的工程,同时将G32A1xxx_SDK_V1.1\Examples\G32A1465\ADC\ ADC_SoftwareConversion\Source目录下的main.c也打开(注意使用打开文件的方式打开,不是添加!)
2. 打开ADCmain.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. ADCmain中的几个函数定义拷贝过来:
//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显示,数值不是同步的。视频还没有传上去,之后将连接做上。





4_01.jpg (350.05 KB )

4_01.jpg

4_02.jpg (2.77 MB )

4_02.jpg

使用特权

评论回复
沙发
zhjb1|  楼主 | 2024-12-16 17:55 | 只看该作者
说明,看我的代码会少了许多注释等,因为这些占的行数较多,当代码一长看起来比较累。我就将他们缩略或删除了。Sorry

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

55

主题

256

帖子

1

粉丝