找回密码
 立即注册
查看: 471|回复: 8

AI8H2K12U制作简单的USB功率计-新手入门DIY

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-05-01 17:22:41

3

主题

85

回帖

846

积分

高级会员

积分
846
发表于 2025-2-9 20:32:24 | 显示全部楼层 |阅读模式
需求:使用AI单片机设计一款简单的USB功率计
1、要求能测量电压0-20V、电流0-5A;
2、指示灯1s闪烁或呼吸灯;
3、底层本,简单,易上手,焊接。
整个过程包含GPIO、UART、ADC、IIC,标准库函数方式进行编程。


方案:技术评估

1、电流通过INA180A1芯片转化为电压进行采集;

2、电压通过高精度电阻分压进行采集;
3、USB2TTL模块进行串口通信,LED闪烁,OLED显示


硬件设计:SCH+PCB+PCBA+手工SMT


实物图Top-3D.jpg 实物图BOT-3D.jpg


实物图Top.jpg 实物图BOT.jpg

软件开发:标准库开发
GPIO:

  1. /**
  2.         * @brief  GPIO_Init
  3.         * @param  None
  4.         * @retval None      
  5. */
  6. void GPIO_Init(void)
  7. {
  8.     P3_MODE_IO_PU(GPIO_Pin_0);
  9.     P3_MODE_IO_PU(GPIO_Pin_1);
  10.     P3_MODE_IO_PU(GPIO_Pin_2);
  11.     P3_MODE_IO_PU(GPIO_Pin_3);
  12.     P3_MODE_IO_PU(GPIO_Pin_7);
  13.    
  14.     LED = 1;
  15. }
复制代码


UART:
  1. /**
  2.         * @brief  LED_Init
  3.         * @param  None
  4.         * @retval None      
  5. */
  6. void UART_Init(void)
  7. {
  8.     COMx_InitDefine UART_InitStruct = {0};
  9.     UART_InitStruct.BaudRateDouble = DISABLE;
  10.     UART_InitStruct.Morecommunicate = DISABLE;
  11.     UART_InitStruct.UART_BaudRate = 115200;
  12.     UART_InitStruct.UART_BRT_Use = BRT_Timer1;
  13.     UART_InitStruct.UART_Mode = UART_8bit_BRTx;
  14.     UART_InitStruct.UART_RxEnable = DISABLE;
  15.    
  16.     UART_Configuration(UART1, &UART_InitStruct);
  17.     NVIC_UART1_Init(ENABLE,Priority_0);
  18.    
  19.     UART1_SW(UART1_SW_P30_P31);
  20. }
复制代码

I2C:
  1. /**
  2.         * @brief  I2C_Cfg
  3.         * @param  None
  4.         * @retval None      
  5. */
  6. void I2C_Cfg(void)
  7. {
  8.     I2C_InitTypeDef I2C__InitStruct = {0};;
  9.     I2C__InitStruct.I2C_Enable = ENABLE;
  10.     I2C__InitStruct.I2C_Mode = I2C_Mode_Master;
  11.     I2C__InitStruct.I2C_MS_WDTA = DISABLE;
  12.     I2C__InitStruct.I2C_Speed = 13;                                       //总线速度=Fosc/2/(Speed*2+4)=24M/2/(13*2+4)=400kHz
  13.     I2C_Init(&I2C__InitStruct);
  14.     I2C_SW(I2C_P33_P32);
  15. }
复制代码
  1. void I2C_WriteByte(uint8_t byte,uint8_t mode)    //OLED驱动写函数
  2. {
  3.         Start();                                //发送起始命令
  4.         SendData(0x78);                                    //发送设备地址+写命令
  5.         RecvACK();
  6.         if(mode)
  7.     {
  8.         SendData(0x40);                     //发送存储地址;
  9.     }
  10.     else
  11.     {
  12.         SendData(0x00);                     //发送存储地址;
  13.     }        
  14.         RecvACK();
  15.         SendData(byte);
  16.     RecvACK();
  17.         Stop();                                 //发送停止命令
  18. }
复制代码


ADC:
  1. /**
  2.         * @brief  ADC_Init
  3.         * @param  None
  4.         * @retval None      
  5. */
  6. void ADC_Init(void)
  7. {
  8.     ADC_InitTypeDef ADC__InitStruct = {0};
  9.     ADC__InitStruct.ADC_AdjResult = ADC_RIGHT_JUSTIFIED;
  10.     ADC__InitStruct.ADC_CsHold = 1;
  11.     ADC__InitStruct.ADC_CsSetup = 0;
  12.     ADC__InitStruct.ADC_SMPduty = 15;
  13.     ADC__InitStruct.ADC_Speed = ADC_SPEED_2X16T;
  14.     ADC_Inilize(&ADC__InitStruct);
  15.     ADC_PowerControl(ENABLE);
  16.     delay_ms(1);
  17. }
复制代码


OLED:
  1. void OLED_Init(void)
  2. {
  3.         I2C_Cfg();
  4.     delay_ms(200);
  5.         
  6.         OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
  7.         OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
  8.         OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
  9.         OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
  10.         OLED_WR_Byte(0xB0,OLED_CMD);
  11.     OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
  12.         OLED_WR_Byte(0xCF,OLED_CMD); // Set SEG Output Current Brightness
  13.         OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
  14.         OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常
  15.         OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
  16.         OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
  17.         OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
  18.         OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset        Shift Mapping RAM Counter (0x00~0x3F)
  19.         OLED_WR_Byte(0x00,OLED_CMD);//-not offset
  20.         OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
  21.         OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
  22.         OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
  23.         OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
  24.         OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
  25.         OLED_WR_Byte(0x12,OLED_CMD);
  26.         OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
  27.         OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
  28.         OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
  29.         OLED_WR_Byte(0x02,OLED_CMD);//
  30.         OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
  31.         OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
  32. //        OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
  33. //        OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7)
  34.         OLED_Clear();
  35.         OLED_WR_Byte(0xAF,OLED_CMD); /*display ON*/
  36. }
复制代码

Main:
  1. void main(void)
  2. {
  3.     float current = 0.0;
  4.     float voltage = 0.0;
  5.     float power = 0.0;
  6.     char OLED[9] = {0};
  7.     EAXSFR();
  8.    
  9.     GPIO_Init();
  10.     UART_Init();
  11.     ADC_Init();
  12.    
  13.     EA = 1;
  14.    
  15.         OLED_Init();//初始化OLED
  16.         OLED_ColorTurn(1);//0正常显示,1 反色显示
  17.     OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
  18.     delay_ms(20);
  19.     while(1)
  20.     {
  21.         current = Get_ADCResult(ADC_CH0) * 3.3 / 4096 * 2 ;
  22.         delay_ms(3);
  23.         voltage = Get_ADCResult(ADC_CH1) * 3.3 / 4096 * 11;
  24.         power = current * voltage;
  25.         printf("Current = %ld, Voltage = %ld, Power = %ld\r\n", current, voltage, power);
  26.         
  27.         
  28.         sprintf(OLED,"I:%.3fA", current);
  29.         OLED_ShowString(28,0,OLED,16);
  30.         sprintf(OLED,"U:%.3fV", voltage);
  31.         OLED_ShowString(28,2,OLED,16);
  32.         
  33.         sprintf(OLED,"P:%.3fW", power);
  34.         OLED_ShowString(28,4,OLED,16);        
  35.         
  36.         LED = !LED;
  37.         delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);
  38.     }
  39. }
复制代码

BOM:

(不涉及邮费,建议多买几个物料)


成品:效果展示
实测图.jpg
(可自己添加外壳,螺柱固定等)


总结
1、设计简单,把它当一个小产品去开发,从需求、方案、软硬件等标准流程进行,由小到大,由简入繁;
2、硬件SCH+PCB+PCBA+手工SMT,嘉立创免费打样PCB是为学习、工作提供了太多试错机会,学会画板,焊接,调试,下载;
3、软硬件结合,硬件如何设计,软件如何对应写代码,标准库设计,方便移植。

后记
截图202502092030314658.jpg
(USB2TTL模块也可以用STC8H2K12U-SOP16进行设计,2路串口,波特率支持10Mbps,电源可控,特别适合STC开发)

STC8H2K12U USB Meter.7z (131.98 KB, 下载次数: 25)


截图202502092005131614.jpg
截图202502092017259511.jpg
截图202502092028187967.jpg
3 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:399
  • 最近打卡:2025-05-01 07:39:13

2

主题

170

回帖

196

积分

注册会员

积分
196
发表于 2025-3-11 00:17:43 来自手机 | 显示全部楼层
漂亮……现在很少动手做这些了…
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:108
  • 最近打卡:2025-05-01 08:20:47
已绑定手机

1

主题

63

回帖

521

积分

高级会员

积分
521
发表于 2025-3-11 07:31:06 | 显示全部楼层
必须点赞
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:381
  • 最近打卡:2025-05-01 08:27:28
已绑定手机

10

主题

146

回帖

458

积分

中级会员

积分
458
发表于 2025-3-11 07:34:49 | 显示全部楼层
收藏学习
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2025-3-11 07:58:16 | 显示全部楼层
不错,必须点赞!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-3-11 08:52:41 | 显示全部楼层
利用定时器延时,期间可以进入IDLE模式,可以省很多电
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1319

回帖

2938

积分

荣誉版主

无情的代码机器

积分
2938
发表于 2025-3-11 17:35:33 | 显示全部楼层
优雅
三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-05-01 17:23:15
已绑定手机

0

主题

1

回帖

26

积分

新手上路

积分
26
发表于 5 天前 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 前天 10:40 | 显示全部楼层
字库居然放在XDATA空间
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:50 , Processed in 0.403561 second(s), 118 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表