1:项目说明
使用立创地文星开发板制作的usb-hub,可显示电压电流,统计功率,显示电流波形。
电压最大6.6V,电流最大3.3A。
2:电路
1:usb输入

USB5为数据,USB6为外接电源。
2:

使用1.14寸屏幕,spi协议。
3:测电流

使用TP181A1-CR电流感应放大器,分流电阻为20mΩ,芯片参考电压为3.3V时,可测最大电流3.3A。
4:usb-hub

使用ch334p,usb2.0,一个LED 指示灯。
3:软件
adc和dma的配置。
void adc_dma_config(void)
{
DMA_InitTypeDef DMA_InitStruct = {0};
__RCC_DMA_CLK_ENABLE();
DMA_InitStruct.DMA_DstAddress = (uint32_t)ADC4_ResultBuff; // 目标地址
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase; // 目标地址递增
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK; // BLOCK 传输模式
DMA_InitStruct.DMA_SrcAddress = (uint32_t)&CW_ADC->RESULT0; // 源地址: ADC 的结果寄存器
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix; // 源地址固定
DMA_InitStruct.DMA_TransferCnt = 0x6; // DMA 传输次数
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_16BIT; // 数据位宽 16bit
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;//DMA_HardTrig_ADC_TRANSCOMPLETE; // ADC 转换完成硬触发
DMA_InitStruct.TrigMode = DMA_HardTrig; // 硬触发模式
DMA_Init(CW_DMACHANNEL1, &DMA_InitStruct);
DMA_Cmd(CW_DMACHANNEL1, ENABLE);
DMA_InitStruct.DMA_DstAddress = (uint32_t)ADC3_ResultBuff; // 目标地址
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase; // 目标地址递增
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK; // BLOCK 传输模式
DMA_InitStruct.DMA_SrcAddress = (uint32_t)&CW_ADC->RESULT1; // 源地址
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix; // 源地址固定
DMA_InitStruct.DMA_TransferCnt = 0x6; // DMA 传输次数
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_16BIT; // 数据位宽 16bit
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;//DMA_HardTrig_GTIM2_OVERINT; // ADC 转换完成硬触发
DMA_InitStruct.TrigMode = DMA_HardTrig; // 硬触发模式
DMA_Init(CW_DMACHANNEL2, &DMA_InitStruct);
DMA_Cmd(CW_DMACHANNEL2, ENABLE);
DMA_InitStruct.DMA_DstAddress = (uint32_t)ADC2_ResultBuff; // 目标地址
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase; // 目标地址递增
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK; // BLOCK 传输模式
DMA_InitStruct.DMA_SrcAddress = (uint32_t)&CW_ADC->RESULT2; // 源地址
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix; // 源地址固定
DMA_InitStruct.DMA_TransferCnt = 0x6; // DMA 传输次数
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_16BIT; // 数据位宽 16bit
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;//DMA_HardTrig_GTIM2_OVERINT; // ADC 转换完成硬触发
DMA_InitStruct.TrigMode = DMA_HardTrig; // 硬触发模式
DMA_Init(CW_DMACHANNEL3, &DMA_InitStruct);
DMA_Cmd(CW_DMACHANNEL3, ENABLE);
DMA_InitStruct.DMA_DstAddress = (uint32_t)ADC1_ResultBuff; // 目标地址
DMA_InitStruct.DMA_DstInc = DMA_DstAddress_Increase; // 目标地址递增
DMA_InitStruct.DMA_Mode = DMA_MODE_BLOCK; // BLOCK 传输模式
DMA_InitStruct.DMA_SrcAddress = (uint32_t)&CW_ADC->RESULT3; // 源地址
DMA_InitStruct.DMA_SrcInc = DMA_SrcAddress_Fix; // 源地址固定
DMA_InitStruct.DMA_TransferCnt = 0x6; // DMA 传输次数
DMA_InitStruct.DMA_TransferWidth = DMA_TRANSFER_WIDTH_16BIT; // 数据位宽 16bit
DMA_InitStruct.HardTrigSource = DMA_HardTrig_ADC_TRANSCOMPLETE;//DMA_HardTrig_GTIM2_OVERINT; // ADC 转换完成硬触发
DMA_InitStruct.TrigMode = DMA_HardTrig; // 硬触发模式
DMA_Init(CW_DMACHANNEL4, &DMA_InitStruct);
DMA_Cmd(CW_DMACHANNEL4, ENABLE);
}
void adc_config(void)
{
ADC_DeInit();
ADC_InitTypeDef ADC_InitStructure = {0};
ADC_SerialChTypeDef ADC_SerialChStructure = {0};
__RCC_ADC_CLK_ENABLE();
ADC_InitStructure.ADC_AccEn = ADC_AccDisable;// ADC 累加功能不开启
ADC_InitStructure.ADC_Align = ADC_AlignRight;// 采样结果右对齐,即结果存于 bit11~bit0
ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div4;// ADC 的 采 样 时 钟 为 PCLK 的 4 分 频, 即ADCCLK=16MHz
ADC_InitStructure.ADC_DMAEn = ADC_DmaEnable;// ADC 转换完成触发 DMA
ADC_InitStructure.ADC_InBufEn = ADC_BufDisable;// 高速采样,ADC 内部电压跟随器不使能
ADC_InitStructure.ADC_OpMode = ADC_SingleChOneMode;// 单次单通道采样模式
ADC_InitStructure.ADC_SampleTime = ADC_SampTime10Clk;// 设置为 10 个采样周期,须根据实际况调整
ADC_InitStructure.ADC_TsEn = ADC_TsDisable;// 内部温度传感器禁止
ADC_InitStructure.ADC_VrefSel = ADC_Vref_VDDA;// 采样参考电压选择为 VDDA
ADC_SerialChStructure.ADC_Sqr0Chmux = ADC_SqrCh0;
ADC_SerialChStructure.ADC_Sqr1Chmux = ADC_SqrCh1;
ADC_SerialChStructure.ADC_Sqr2Chmux = ADC_SqrCh2;
ADC_SerialChStructure.ADC_Sqr3Chmux = ADC_SqrCh3;
ADC_SerialChStructure.ADC_SqrEns = ADC_SqrEns03;
ADC_SerialChStructure.ADC_InitStruct = ADC_InitStructure;
/* 序列通道连续采样模式 */
ADC_SerialChContinuousModeCfg(&ADC_SerialChStructure);
adc_dma_config();
ADC_Enable();// 启用 ADC
ADC_SoftwareStartConvCmd(ENABLE);
}
4:外壳

使用solidworks设计的外壳。
5:实物





6:视频
b站链接:https://www.bilibili.com/video/BV14NWWecEzg/?vd_source=a83c174a9f85373eb37ec3663e1ac747
评论