
专业版
简易电压电流表
100
0
0
0
简介
基于立创地文星CW32F030C8T6的简易电压电流表。
简介:基于立创地文星CW32F030C8T6的简易电压电流表。开源协议
:GPL 3.0
(未经作者授权,禁止转载)创建时间:2024-07-22 13:08:26更新时间:2024-08-21 09:57:48
描述
1.硬件设计
- 基于官方原理图,进行了修改。
- 使用LCD1602替换数码管。
- 增加了按键控制继电器切换电压电流的功能。
4. 去除了部分模块。
5. 增加了type-c输入。
6. 大都为直插器件,方便焊接。
2.软件设计
- 使用了定时器触发ADC+DMA转运
void AD_GPIO_Init(void)
{
__RCC_GPIOA_CLK_ENABLE(); // 开启GPIOA时钟
__RCC_GPIOB_CLK_ENABLE(); // 开启GPIOB时钟
PA00_ANALOG_ENABLE(); // PA0设定为模拟输入
PA01_ANALOG_ENABLE(); // PA1设定为模拟输入
PA01_ANALOG_ENABLE(); // PA2设定为模拟输入
PB11_ANALOG_ENABLE(); // PB11设定为模拟输入
}
// ADC配置
void AD_Init(void)
{
__RCC_ADC_CLK_ENABLE(); // 开启ADC时钟
ADC_DeInit();
ADC_SerialChTypeDef ADC_SerialChStruct; // ADC序列配置
ADC_SerialChStruct.ADC_SqrEns = ADC_SqrEns03; // 转换 SQR0,SQR1,SQR2,SQR3
ADC_SerialChStruct.ADC_InitStruct.ADC_OpMode = ADC_SerialChScanMode; // 序列扫描转换模式
ADC_SerialChStruct.ADC_InitStruct.ADC_ClkDiv = ADC_Clk_Div128; // ADC时钟频率 = PCLK / 4 = 64MHz / 4 = 16MHz
ADC_SerialChStruct.ADC_InitStruct.ADC_SampleTime = ADC_SampTime10Clk; // 采样时间->10个ADC时钟周期
ADC_SerialChStruct.ADC_InitStruct.ADC_VrefSel = ADC_Vref_VDDA; // VDDA参考电压
ADC_SerialChStruct.ADC_InitStruct.ADC_InBufEn = ADC_BufDisable; // 关闭输入缓冲器(跟随器),在不需要额外驱动能力或增益时使用
ADC_SerialChStruct.ADC_InitStruct.ADC_TsEn = ADC_TsDisable; // 关闭内置温度传感器
ADC_SerialChStruct.ADC_InitStruct.ADC_DMAEn = ADC_DmaEnable; // ADC转换完成触发DMA传输
ADC_SerialChStruct.ADC_InitStruct.ADC_Align = ADC_AlignRight; // ADC转换结果右对齐
ADC_SerialChStruct.ADC_InitStruct.ADC_AccEn = ADC_AccDisable; // 禁止结果累加功能,每次转换的结果不会与前一次的结果相加。
ADC_SerialChScanModeCfg(&ADC_SerialChStruct); // ADC序列扫描转换模式配置
// 配置通道
CW_ADC->SQR_f.SQR0 = ADC_ExInputCH0; // PA0
CW_ADC->SQR_f.SQR1 = ADC_ExInputCH1; // PA1
CW_ADC->SQR_f.SQR2 = ADC_ExInputCH2; // PA2
CW_ADC->SQR_f.SQR3 = ADC_ExInputCH12; // PB11
ADC_ExtTrigCfg(ADC_TRIG_GTIM2, ENABLE); // ADC外部中断触发源配置 定时器2触发
}
// ADC DMA配置
void AD_DMA_Init()
{
__RCC_DMA_CLK_ENABLE(); // 使能DMA时钟
DMA_DeInit(CW_DMACHANNEL1);
DMA_InitTypeDef DMA_InitStruct; // DMA初始化结构体
DMA_StructInit(&DMA_InitStruct); // 使用默认参数填充DMA初始化结构体
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK; // 使用BLOCK触发 非锁定传输
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_32BIT; // 数据宽度为12Bit
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Increase; // ADC外设地址固定
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase; // 目标地址自动增加
DMA_InitStruct.DMA_TransferCnt = 4; // 传输次数4次
DMA_InitStruct.DMA_SrcAddress = (uint32_t)(&(CW_ADC->RESULT0)); // ADC数据寄存器地址(源地址)
DMA_InitStruct.DMA_DstAddress = (uint32_t)ADC_Value; // 目标地址
DMA_InitStruct.TrigMode = DMA_HardTrig; // 硬件触发
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE; // ADC作为触发源
DMA_Init(CW_DMACHANNEL1, &DMA_InitStruct); // 初始化DMA
NVIC_EnableIRQ(DMACH1_IRQn); // 使能NVIC
NVIC_SetPriority(DMACH1_IRQn, 0); // 设置中断优先级
DMA_ITConfig(CW_DMACHANNEL1, DMA_IT_TC, ENABLE); // 使能DMA传输 完成 中断
DMA_ITConfig(CW_DMACHANNEL1, DMA_IT_TE, ENABLE); // 使能DMA传输 错误 中断
}
void Error_Handler(void)
{
while(1)
{
}
}
// DMA中断函数
void DMACH1_IRQHandler(void)
{
if (DMA_GetITStatus(DMA_IT_TC1) == SET)
{
CW_DMA->CNT1_f.CNT = 4;
CW_DMA->CNT1_f.REPEAT = 1;
CW_DMACHANNEL1->SRCADDR = (uint32_t)(&(CW_ADC->RESULT0)); // 设置源地址
CW_DMACHANNEL1->DSTADDR = (uint32_t)ADC_Value; // 设置目标地址
DMA_Cmd(CW_DMACHANNEL1, ENABLE); //使能DMA
DMA_ClearITPendingBit(DMA_IT_TC1);
}
if (DMA_GetITStatus(DMA_IT_TE1) == SET)
{
DMA_ClearITPendingBit(DMA_IT_TE1);
}
}
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
- 标定法暂时没有使用。
3.测试
- 电压测试
- 电流测试
设计图

BOM


添加到专辑
0
0
分享
侵权投诉
评论