設計目的(聲明:僅作為個人參考用,希望能多給我點積分以便于下載更多的學習資料,謝謝):
本設計為了方便的觀察手機及其他設備充電時所輸出的電流電壓大小,可進行功耗、充電時間、及充電容量的計算。參數:輸入電壓:5-25v,輸入電流0-3A
設計說明:
采用STC8H3K64S2單片機的12位adc進行電壓及電流
程序代碼已完成顯示wmahwh.zip
(386.82 KB, 下載次數: 81)
2023-12-2 13:26 上傳
點擊文件名下載附件
代碼 下載積分: 黑幣 -5
USB電壓電流檢測儀圖紙.zip
(106.04 KB, 下載次數: 58)
2023-12-2 13:26 上傳
點擊文件名下載附件
圖紙 下載積分: 黑幣 -5
的采樣,用0.91英寸的OLED屏幕來進行顯示。用嘉立創eda進行設計。先看成品如下(具體見附件哈哈):
成品圖片.jpg (2.94 MB, 下載次數: 42)
下載附件
成品圖片
2023-12-2 13:13 上傳
原理圖:
原理圖.jpg (301.94 KB, 下載次數: 51)
下載附件
2023-12-2 13:16 上傳
PCB圖:
PCB3D2.jpg (204.09 KB, 下載次數: 51)
下載附件
2023-12-2 13:15 上傳
pcb3D.jpg (148.57 KB, 下載次數: 32)
下載附件
2023-12-2 13:15 上傳
pcb.jpg (273.75 KB, 下載次數: 49)
下載附件
2023-12-2 13:15 上傳
代碼部分截圖(具體見附件):
#include "STC8xxxx.H"
#include "oled.h"
#include "bmp.h"
#include "config.h"
#include "adc.h"
#include "gpio.h"
#include "delay.h"
#define N 8 //ADC采樣使用遞推平均濾波算法,采樣次數
u8 i;
u16 j;
u32 sum=0; //數值和
u32 sum1=0; //數值和
u16 cut=0; //采樣次數
u16 cu=0;//平均數
u16 ca=0;//平均數
u16 u1=0;
u16 u2=0;
u16 u3=0;
u16 a1=0;
u16 a2=0;
u16 a3=0;
/************* 功能說明 **************
本例程基于STC8H8K64U為主控芯片的實驗箱8進行編寫測試,STC8G、STC8H系列芯片可通用參考.
本程序演示多路ADC查詢采樣,通過串口2發送給上位機,波特率115200,N,8,1。
下載時, 選擇時鐘 22.1184MHz (可以在配置文件"config.h"中修改).
******************************************/
/************* 本地常量聲明 **************/
unsigned int ADC_Buf[N+1]; //采樣數組mA
unsigned char num,ADCcount=0,ADCcount2=0; //ADC采樣次數變量
/************* 本地變量聲明 **************/
/************* 本地函數聲明 **************/
/************* 外部函數和變量聲明 *****************/
/******************* IO配置函數 *******************/
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //結構定義
//AD口設置為輸入口
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
GPIO_InitStructure.Mode = GPIO_HighZ; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P1,&GPIO_InitStructure); //初始化
GPIO_InitStructure.Pin = GPIO_Pin_6 | GPIO_Pin_7; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的輸入或輸出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P4,&GPIO_InitStructure); //初始化
}
/******************* AD配置函數 *******************/
void ADC_config(void)
{
ADC_InitTypeDef ADC_InitStructure; //結構定義
ADC_InitStructure.ADC_SMPduty = 31; //ADC 模擬信號采樣時間控制, 0~31(注意: SMPDUTY 一定不能設置小于 10)
ADC_InitStructure.ADC_CsSetup = 0; //ADC 通道選擇時間控制 0(默認),1
ADC_InitStructure.ADC_CsHold = 1; //ADC 通道選擇保持時間控制 0,1(默認),2,3
ADC_InitStructure.ADC_Speed = ADC_SPEED_2X1T; //設置 ADC 工作時鐘頻率 ADC_SPEED_2X1T~ADC_SPEED_2X16T
ADC_InitStructure.ADC_Power = ENABLE; //ADC功率允許/關閉 ENABLE,DISABLE
ADC_InitStructure.ADC_AdjResult = ADC_RIGHT_JUSTIFIED; //ADC結果調整, ADC_LEFT_JUSTIFIED,ADC_RIGHT_JUSTIFIED
ADC_InitStructure.ADC_Priority = Priority_0; //指定中斷優先級(低到高) Priority_0,Priority_1,Priority_2,Priority_3
ADC_InitStructure.ADC_Interrupt = DISABLE; //中斷允許 ENABLE,DISABLE
ADC_Inilize(&ADC_InitStructure); //初始化
ADC_PowerControl(ENABLE); //單獨的ADC電源操作函數, ENABLE或DISABLE
}
void ADCCL(void)
{
if(cut<20000)
{
Get_ADCResult(1); //電流
Get_ADCResult(2); //電壓
sum1+=Get_ADCResult(1);
sum+=Get_ADCResult(2);
cut++;
}
if(cut>=20000)
{
cu=sum/20000;
ca=sum1/20000;
sum=0;
sum1=0;
cut=0;
cu=cu*0.902077193; //ADC平均值轉化成電壓值
// OLED_ShowNum(0,2,cu,7,16);
u1=cu/100; //
OLED_ShowNum(0,0,u1,2,16);//整數部分電壓值
u2=cu%100/10;
OLED_ShowNum(20,0,u2,1,16); //小數部分1位電壓值
u3=cu%1000;
OLED_ShowNum(28,0,u3,1,16); ////小數部分2位電壓值
ca=ca*0.20143615924092; //ADC平均值轉化成mA電流值
a1=ca/100; //
OLED_ShowNum(75,0,a1,2,16);//整數部分電流值
a2=ca%100/10;
OLED_ShowNum(95,0,a2,1,16); //小數部分1位電電流值
a3=ca%1000;
OLED_ShowNum(103,0,a3,1,16); ////小數部分2位電流值
// OLED_ShowNum(75,2,ca,4,16);
}
}
/**********************************************/
void main(void)
{
// u8 i;
// u16 j;
GPIO_config();
ADC_config();
EA = 1;
P3M1 = 0x00;
P3M0 = 0x00;
OLED_Init();//初始化OLED
OLED_ColorTurn(0);//0正常顯示,1 反色顯示
OLED_DisplayTurn(0);//0正常顯示 1 屏幕翻轉顯示
OLED_Clear();
OLED_ShowString(17,0,".",16);
OLED_ShowString(40,0,"V",16);
OLED_ShowString(112,0,"A",16);
OLED_ShowString(91,0,".",16);
while (1)
{
// OLED_ShowString(0,2,"T:",16);
// OLED_ShowString(16,2,"00:00",16);
// OLED_ShowString(70,2,"5000",16);
// OLED_ShowString(102,2,"mAh",16);
ADCCL();
// delay_ms(250);
}
}
|