内容介绍
内容介绍
实验任务:
- 通过编程完成对5种以上元器件特性的测量,比如:
- 电阻
- 电容
- 电感
- 二极管
- 三极管
- 能够自动识别元器件
- 在OLED屏幕上通过图形化的界面显示各种元器件的符号及测量得到的信息
以上完成对元件的自动识别,电阻电容二极管三极管参数测量.
参考之前的CH579F元器件特性测试仪, 本次基于STM32G031的最小系统模块,在之前的代码上进行移植,修复了电感无法识别的BUG
首先建立CubeIDE工程, 配置引脚和片内外设如下:
其中Probe是直接通过ADC测量的引脚;
STA_LED为核心上的指示灯, 与TIM16模块连接, 后来因为FLASH占用量过高, 将此模块代码取消.
为了移植适配参考的代码,的修改部分代码片段:
- 修改IO功能, 其中当IO配置为浮空时, 直接将其初始化为模拟模式
/******************************************************************************* * Function Name : MeasurePort_Init * Description : 初始化测试端口模式 * Input : port: 端口选择 mode: 端口模式选择 level: 引脚输出电平设置,端口模式为浮空时任意设置即可 * Return : None *******************************************************************************/ void MeasurePort_Init(MEASUREPORT port, PORTMODE mode, uint8_t level) { switch(mode) { case PORT_WITH_NONE: GPIO_ModeCfg(port.PIN_WITH_NONE, GPIO_MODE_OUTPUT_PP); HAL_GPIO_WritePin(port.PIN_WITH_NONE.GPIO_Port,port.PIN_WITH_NONE.PIN,level); GPIO_ModeCfg(port.PIN_WITH_680, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_470K, GPIO_MODE_ANALOG); break; case PORT_WITH_680: GPIO_ModeCfg(port.PIN_WITH_NONE, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_680, GPIO_MODE_OUTPUT_PP); HAL_GPIO_WritePin(port.PIN_WITH_680.GPIO_Port,port.PIN_WITH_680.PIN,level); GPIO_ModeCfg(port.PIN_WITH_470K, GPIO_MODE_ANALOG); break; case PORT_WITH_470K: GPIO_ModeCfg(port.PIN_WITH_NONE, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_680, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_470K, GPIO_MODE_OUTPUT_PP); HAL_GPIO_WritePin(port.PIN_WITH_470K.GPIO_Port,port.PIN_WITH_470K.PIN,level); break; case PORT_FLOATING: GPIO_ModeCfg(port.PIN_WITH_NONE, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_680, GPIO_MODE_ANALOG); GPIO_ModeCfg(port.PIN_WITH_470K, GPIO_MODE_ANALOG); break; default: break; } }
-
IO的初始化直接调用HAL库函数
/******************************************************************************* * Function Name : GPIO_ModeCfg * Description : GPIO模式配置 * Input : pin: 端口选择 mode: 输入输出模式 * Return : None *******************************************************************************/ void GPIO_ModeCfg(GPIO_PIN pin, uint32_t mode) { GPIO_InitTypeDef GPIO_InitStruct = {0}; HAL_GPIO_DeInit(pin.GPIO_Port, pin.PIN); GPIO_InitStruct.Pin = pin.PIN; GPIO_InitStruct.Mode = mode; HAL_GPIO_Init(pin.GPIO_Port, &GPIO_InitStruct); }
- 修改ADC代码采集功能
void ADC_ChannelCfg(uint16_t ch) { ADC_ChannelConfTypeDef sConfig = {0}; GPIO_InitTypeDef GPIO_InitStruct = {0}; switch (ch) { case TP1: GPIO_InitStruct.Pin = Probe1_Pin; sConfig.Channel = ADC_CHANNEL_5; break; case TP2: GPIO_InitStruct.Pin = Probe2_Pin; sConfig.Channel = ADC_CHANNEL_6; break; case TP3: GPIO_InitStruct.Pin = Probe3_Pin; sConfig.Channel = ADC_CHANNEL_7; break; default: break; } GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; //GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_ADC_ConfigChannel(&hadc1, &sConfig); }
- 真实电压转换采用HAL库内置
/******************************************************************************* * Function Name : ADC_RealVol * Description : ADC实际电压值计算 * Input : val: ADC的值 * Return : (double)实际电压值 *******************************************************************************/ double ADC_RealVol(uint16_t val) { return (__HAL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, val, ADC_RESOLUTION_12B)/1000.0); }
其他代码部分移植源于沁恒的参考设计
检测与配置部分在视频中有所讲解
代码在后续文档中打包
总结:
个人觉得代码还是有一些臃肿, 必要时可能会因为FLASH空间占用, 牺牲一定的阅读性
完成项目之时恰赶上开学临近, 虽然项目有放宽提交, 但还是有点粗糙, 后期还要再修剪一番
会更新在项目后
软硬件
附件下载
ComponentTester.rar
使用CubeIDE建立工程并调试
团队介绍
安徽师范大学
团队成员
Chou Ds
通信工程菜鸡一枚
评论
0 / 100
查看更多