|
学习主题:/ y# T& T% \) K. r* { 设计一个以STM32F103C8T6为主控的小型多功能电子负载,程序使用uCOS嵌入式操作系统开发。 电子负载具有电源输出功能,能够模拟锂电池以测试充电器,并能测试各种电池的放电曲线。 希望通过此次设计来学习提高 STM32F103系列的编程应用能力。 小组宣言:兴趣是提高自我的动力! " M, Q; v9 I6 s b4 b7 P8 D- k" e 学习计划: 本 周——硬件电路设计(原理图)% @/ E0 X- d( q" @$ i# q . F) A1 t4 G B4 H3 t3 s/ ]8 t# g8 I/ p# M7 y; X 第二周——硬件电路设计(PCB) 第三周——硬件电路调试 & 底层硬件驱动程序调试(STM32F103 各种资源的学习与应用) 第四周——底层硬件驱动程序编写(STM32F103 各种资源的学习与应用) 后 期——完成总体程序编写工作, 产品调试、装配与测试 & c0 F& [: k" ]0 H* ~1 k" g , b0 z2 O5 T% T* E 小组现有成员: : r4 P, }' }# dxiao5333(负责硬件电路设计和STM32程序编写) 飘雨(负责部分底层硬件驱动程序编写) gdgly(负载上位机软件与通信协议编写) cmz871627(负责部分底层硬件驱动程序编写) . |9 l, E" \6 @9 I 队员在招人数:2~5人(请想参加的童鞋加QQ讨论群61070251) 7 E9 s/ P! ~/ \7 F# ^8 @+ t% G. z# s% U9 V) K- W! Y 招募条件——有STM32F系列使用基础,能够使用uCOS编写程序 $ u6 Q) g6 I2 A$ r5 } F1 v 或 * _0 s+ Z, n8 _* ~, y2 T 能够使用C++或C#编写PC端软件 / F. ]- {7 X5 `- L) l* [ 招募待遇——所有小组成员免费赠送该制作的打样电路板一块(空板),有突出贡献者免费赠送成品电路板或STM32开发板 6 R% ~7 p/ T" N- |: f 学习进度: 6 b: [- W: Z5 u6 d# L/ V( R, U- V5月30日 方案制定完成(xiao5333) * u9 M; Z# f" s4 J c( q6月1日 完成电子负载原理图设计(xiao5333) 6月5日 完成PCB图绘制,并外协加工 ' a8 Z9 r1 s/ j& ~: T" y2 O/ v6月13日 电路调试完成 6月14日 ADC底层硬件驱动 6月15日 底层硬件驱动编写完成 ; P& u W+ M' {6月25日 完成总体程序编写工作 6月25日 完成样机安装测试(实现初步功能) ; Q6 p% _& f1 |9 {至此完成阶段性学习目标……^_^ 6 S' \* }: ^1 P8 {0 z以后逐步完善细节和上位机通信功能。 ' _! G3 e k! P4 A
/******************************************************************************************************************************************************/ + m( i: _% j, @. x0 s: U% E9 x5 Z) X# w. I4 v6 C4 @' h 4 L g1 B( t) ^6 i M, R6 _3 E ![]() 前言: 现在的生活工作和各种电池、电源接触的机会是越来越多,可不靠谱的事情时有发生。1 `5 ~1 K% Y ^. `' O 如我前个月买个安卓智能手机,配的电池标称1800mAh,可用不了一天就没电了。使用公司的程控电池测试仪测试只有1300mAh,肯定是无良的奸商把原装电池换走了。要是手边有个小型便携的电子负载,当时就能测出容量大小,不用等公司的仪器空闲。哎……8 [2 t7 Q$ C: ?. s5 H 趁现在工作不是很忙,设计一个小型多功能的电子负载吧! 可以电源输出调试电路,恒压恒流输出给锂电池充电,可以恒流负载测试电池、源出式恒压负载测试充电器(本设计的重点特色功能) 正好STM32社区有这个活动,希望能有一些志同道合和朋友一起完善这个小制作(当然不能亏待大家)。开始吧…… 6 y+ J# r7 T0 V& l8 [) p3 o - p, N1 P( r8 W% z& b7 y 6 T% U' y6 N5 U, ~ ( f) m, U8 A0 K/ M0 K 系统详细任务需求( `# l {$ h1 Z+ q: r8 U; q! a9 B' d. r 主要功能: 电源恒压、恒流输出模式;6 m9 [; {2 ]6 h5 M( | 恒压、恒流负载输入模式;' D5 S) z0 ~0 C6 e 恒压输出+恒压输入 充电器测试模式;. @$ D% i" T! K2 d2 S( l 过压、过流、过功率、过热保护;5 c( m! V9 N; _; E2 z LCD1602显示; 根据温度变化,智能风扇系统;+ a: }9 I/ V& n- K- K* ?/ o & ]% c; ]3 n5 v0 z9 \ 硬件设计规格: 输入 1.功率 50W9 V4 Y1 f+ L) i4 Y+ M 2.电流 0-5A P R; G0 A8 ~. i i 3.电压 1.5-30V 输出 1.功率 20W 2.电流 0-1A 3.电压 1.5-30V 尺寸重量 体积能够装入普通废旧光驱壳内,重量小于1kg 0 L- D) J q! Q 硬件设计需求:, g8 U8 k" {; ?8 y 主要实现输入输出的恒压、恒流控制,能够使用STM32设置参数 STM32底层软件设计需求:) v' L+ Z7 W# F+ C 1.ADC采样反馈电压(主回路电压、电流、基准等) 2.DAC使用PWM输出,通过占空比调节5 K5 q, U+ {, q5 j0 m 3.键盘任务(STM32定时器自带编码器接口和普通按键) 4.LCD1602字符型液晶屏显示 5.LED和蜂鸣器控制 6.继电器控制 7.1-Wire总线温度传感器通讯0 W# M( [2 l5 Z& q: k% \. [& C/ a5 g 8.PID控制散热风扇 9.USB、串口通讯# W! j$ V- i r- [: T 由于系统较为复杂,采样uCOS嵌入式操作系统简化任务控制2 [; O7 b( }7 f, E6 m |
微信公众号
手机版
请问楼主,本帖的工程文件还能否找到?能不能给我一份?2197746204@qq.com 感谢~@xiao5333
楼主的资料还有吗?发我一份751821725@qq.com
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
7 L/ B$ U6 j/ Z" D
电源电路:
需要提供+12V/800mA(继电器和风扇),+5V/100mA(运放),+3.3V/100mA(STM32)3种电源电压。
开关电源芯片选用Ti的TPS5430输出大电流+12V电压,+5V和+3.3V要求电源纹波噪声尽量小,使用传统7805和1117稳压芯片提供。- s" W' ~1 F& }. u1 P$ a
; M6 c7 \, w+ M/ c3 b8 L( j
恒流/恒压 反馈电路:5 Y5 q6 F1 d/ V: i- c! Y: q! s
U4 将PWM-电流基准电压 (PWM_A)与U5的测量电流(ADC1)进行对比。如果PWM基准电压高于测量电流,则放大器输出为高,导通Q4。如果基准电压较低,则放大器输出为低,关断Q4。实现硬件输出恒流功能。1 Z* k/ ~% D4 A" y. y0 [8 }4 r
同理, 输出恒压与输入恒流、恒压电路实现方式一样。
- K$ m/ H( Q6 B( w2 m
电压基准:9 e3 d! N( H- t. ~
由于要求不是很高,使用较为廉价的TL431输出2.5V电压基准。
STM32主控:1 }% T9 E) i" M' h+ A
一句话,物尽其用啊!基本上这颗主控的资源都用到了,IO接口、ADC模数转换、PWM输出、定时器编码器接口、串口、USB等等。
STM32F103C8T6主控的资源分解图如下:
原理图:! H* |9 C- \1 [9 M9 X, _7 p
4 \' o* I4 T! l/ ~- c7 K0 H0 O6 {
PCB画好了,今天发厂家做了……
收到板子了,硬件调试已经完成,有2个小bug,呵呵……
调试小结:
这个板子硬件有2个小bug:/ K% p% X4 l8 v4 Y
BUG_01:- ^) P; {4 ~. L2 X# y3 [
问题描述:Q2 MOSFET 的D、S极封装画反(^_^) 5 L; k5 j$ H5 Q8 o* V1 v5 d
BUG_02: $ H- @- r' t! \" N y3 I& o/ x
问题描述:电池模拟负载模式下,输出恒压值有可能比输入负载恒压值偏高,导致上电后负载MOSFET直接导通。, h# |8 s, n- r' [8 o: A: M
解决办法:降低输入负载恒压值,R26到U4C网络并一个1M电阻到GND(需要飞线)。
功率三极管和MOSFET必须用粗线从焊盘引出到散热器进行散热,注意绝缘。
2 V" @& w5 ^3 k8 }
调整参数如下:
1.R45不焊(VREF网络与PV断开);
2.C18不焊,C27换成474,R27 10k换成100R(避免负载恒压震荡);
3.R1 10k换成100k;
4.R14 2K换成1.5K;(VIN * 0.13 = VFB)9 ?# G1 M1 [- |) g9 S1 |' L! u
功能测试及外观图:0 F& o4 \8 M6 r* L( @1 R) Q! ?: A" L
恒流负载,16V/3A。 电源显示电压和负载显示电压差为线上的压降。
恒压负载 7.8V/2A6 Y! `$ q ]1 f/ G) _- j0 H
内部图片- k/ \9 s% H% p& N2 f3 a
背面图片,引出串口和RST/BOOT引脚,方便以后升级
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
01. 学习新建工程文件,编译器配置,如何使用外部有源晶振主时钟;
02. ADC硬件驱动函数:0 v- _9 n5 q* o% R/ j, y7 z `
有4个通道的模拟电压需要采样,分别是电压基准、输出/输入电压、输出电流、输入电流。% ]/ R' G7 I5 r, I t; n/ P
STM32F103C8T6没有vref引脚,所以电压基准必须采样,用来换算VCC的电压。输出和输入电流值通过精密电流传感放大器转化为电压值,1A对应0.5V。多通道电压值通过DMA连续采样,减轻主控负担。' Z6 I$ |7 u* X) ]& f( s" c
ADC硬件驱动函数,分解为ADC初始化函数、DMA初始化函数、电压基准测量换算函数、平均值滤波函数。
03. LED/蜂鸣器等IO硬件驱动函数:& p5 Y8 z! F) |4 F
这个就不解释了,注意部分IO需要屏蔽SWJ调试接口(SWJ配置失能,必须同时开启功能复用 IO 时钟)
04. DS18B20温度传感器1-Wire硬件驱动函数:
按照单总线协议写就行。7 N; Q* h4 l. v) _" ~
( P' Y; p- M( G6 F2 J* _
05. PWM-TIM3 硬件驱动函数:
占空比可调,调节分辨率为665/ b) H9 y. c: V! @, @2 N
" I. Z: M! z w! Z
06. LCD1602 字符型液晶屏硬件驱动函数:3 @) J d& X" N& Z _1 U
07. 增量型旋转编码器硬件驱动函数:4 P" Z2 q% \+ p; U1 Z' H
不得不说STM32的这个定时器扩展功能非常好用,配置好了基本上不占用主控资源
好了,至此本“STM32 多功能电子负载”的底层硬件驱动函数均已发布并测试通过,各位童鞋们可以直接在uCOS中调用。
如有不明白的地方欢迎在交流群中讨论,讨论的内容将汇总成学习记录。
下周将正式使用uCOS搭建系统功能,敬请期待,谢谢~~~9 s# p1 M' m+ q( ?
uCOS任务分析:
首先申明本人也是初次使用uCOS编写程序,如有不妥之处敬请谅解。, V. w$ E: ^: b" @6 E" Q
我编写了5个任务来完成设备的功能:
任务0:初始化任务,本任务完成一些硬件初始化和邮箱创建、其它任务创建工作,完成后任务自我删除。
void Task_Start(void *p_arg)
{7 k5 x' Q/ M: ?, P. V" @
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告: N9 ]2 S& q' Y
SysTick_init();* z- |* M: u* j! T% R
OSTimeDlyHMSM(0, 0,1,0); //延时1s,等待电压基准稳定
Vref_Read(); //读取Vref( n! M) \+ f6 i4 r3 D5 z
Keybox = OSMboxCreate((void * )0); //创建消息邮箱
OSTaskCreate(Task_SELECT,(void *)0, //创建按键任务
&task_select_stk[TASK_SELECT_STK_SIZE-1], TASK_SELECT_PRIO);
0 M% J" n" I- h3 u
OSTaskCreate(Task_MODE,(void *)0, //创建任务 模式切换任务% n0 |$ w! L @$ Y4 \7 k
&task_mode_stk[TASK_MODE_STK_SIZE-1], TASK_MODE_PRIO);9 [9 R. ]3 k9 l$ {, J4 U/ ^
\; Q$ @+ X& q+ l2 b
OSTaskDel(OS_PRIO_SELF); //删除本任务, w; D7 h$ c" d( x: W4 f
}; V D- q0 }. y- ^$ \* q, X
任务1:按键读取任务,取得按键值发送到邮箱
void Task_SELECT(void *p_arg)
{- |" ^. Z0 _1 X% T
uint8_t key_tem = 0;
(void)p_arg;
while (1)' ^4 N+ }& V2 l% ]
{
OSTimeDlyHMSM(0, 0,0,50); //延时20ms+ ^+ Y2 X) Y. m- n
key_tem = KEY_GetChar(); //取得按键值 % v+ W- p/ V: n) a
if(key_tem)9 x, u$ S& m1 ~' z
{* g7 [9 q" F* b3 q- Z& R5 G
OSMboxPost(Keybox, (void *)&key_tem); //发送消息* n: N. I8 p2 h6 i
} ; Q7 H7 ~. p- ~6 G+ V7 c7 V7 W+ l
}
}3 {1 d: V# W/ ?& z
任务2:设置界面任务,本任务完成设置功能,进入输出显示任务后,自我删除。
' q+ b3 i$ r/ Q* }
void Task_MODE(void *p_arg)$ J. G- }3 H X! z' @* x0 _ S8 ^5 c
{ ! R. J) P' t& s8 ]
uint8_t err;. Z ]( \: f$ z1 [6 A, \
uint8_t key_dsp = 0, mode = 0;* h: Z; U& n( s
char adc_v[]="";
char adc_a[]="";
int8_t mode_set = 0;5 |- ^$ _- t9 v. o! p9 F+ h
int16_t counter = 0;+ t) R8 o% H* Y9 E) f
uint16_t i_pulse = 0, v_pulse = 0;
(void)p_arg;
. t- I" T+ D, E$ z6 M
/* 默认恒流负载模式 */) H6 U$ A7 u1 J" R
GPIO_ResetBits(GPIOB, IO_K1_Pin);
GPIO_ResetBits(GPIOB, IO_K2_Pin);/ w; b5 ^- H3 r5 x: x
GPIO_SetBits(GPIOB, IO_LOAD_Pin);
lcd_gotoxy(1,1);
lcd_puts("LCC");( {. g4 R* l1 K" e& W
lcd_gotoxy(5,1);* f) k% g# q+ r0 H
lcd_puts("SET");
sprintf(adc_a, "%5.2f", ((float)i_tem / 10)); //变量转化为字符串& r& k: h" p) p, e) k
lcd_gotoxy(10,2);, O9 ?6 E$ b$ l
lcd_puts(adc_a); //显示字符串 电流值
lcd_puts("A ");! s) @9 C- K2 E5 A5 R7 n2 p0 ]- O
while (1)
{1 `# q+ o1 q6 m7 q) z$ [! J, I
key_dsp = *(uint8_t *)OSMboxPend(Keybox, 200, &err); //等待消息 200个节拍(200ms)后进入就绪状态; D% n9 U' J6 G, V- s7 N
a8 q5 t/ q1 z- f) p
// printf("DSP = %d\r\n", key_dsp);
switch (key_dsp)
{6 e$ x; g( y4 i |! c8 {2 p9 b
case 1: //KEY_OUTPUT: x- R9 q. L: w
{6 J& s/ ~. w- X8 }" R
Output(1); //输出使能/ C" v0 r. r$ U: A8 z% I; A+ h1 u4 G
lcd_gotoxy(5,1);# J5 f6 b7 f7 \1 l3 x
lcd_puts("OUT");* f6 t% z2 P, b" ?6 }" x
User_Led_On(3);4 v& ~5 {3 E8 U2 l: d' w0 y3 x* y
GPIO_SetBits(GPIOB, IO_BR_Pin); //蜂鸣器开( ^" T- ~6 D1 r1 q) u6 }
OSTimeDlyHMSM(0, 0,0,100); //延时100ms5 o2 V5 b. v" F" z! X( o) C8 ^
GPIO_ResetBits(GPIOB, IO_BR_Pin); //蜂鸣器关
. ]2 `* h1 t+ j. t& y$ h
OSTaskCreate(Task_OUTPUT,(void *)0, //创建任务 输出显示任务
&task_output_stk[TASK_OUTPUT_STK_SIZE-1], TASK_OUTPUT_PRIO);: t) D" b1 y! s9 z: Y7 Z
OSTaskCreate(Task_ENC,(void *)0, //创建任务 输出设置任务" |/ X/ d$ Q, D5 w8 T1 v' @
&task_enc_stk[TASK_ENC_STK_SIZE-1], TASK_ENC_PRIO);
K0 R5 Z4 V' m, J4 b
OSTaskDel(OS_PRIO_SELF); //删除本任务
break;5 Z5 }& C! k' |2 ~. {5 @# X2 k
}# r* l$ F( z) @: |& |
case 2: //KEY_ENC0 L: z' b i' Q% e- s5 x
{" N' ^ A5 l: p9 x! f3 A! Z
if(mode) //电流,或其它调节模式2 F L* b( @. _) {. i" Z/ j
{
mode = 0; //电压调节模式
}+ }; I. h# H" y* |4 A) f
else mode = 1; //电流调节模式 9 @) v) @1 [& ~9 J9 N. h
break;
}
case 3: //KEY_ENC_LONG
{+ A+ ] s) ]. ]( S
mode = 2; //系统模式调节& P: r9 j4 \9 |2 \, Q
break;
}
}
counter = ENC_GetCounter(); //取得ENC变量3 {2 x0 j1 M* W4 Y1 R' J
ENC_CounterInit(); //计数初始化3 t: U/ U% W! s* Z
' \5 Q O; D" E6 y# k
if(mode == 0) //电压调节模式% K! e7 B% b+ i+ A) _
{
v_tem += counter;% @' g- r. F i+ q4 _
if(v_tem
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
本人有2年的STM32F103系列的编程系列,一般用Keil编译器,没玩过uCOS,可以向你请教吗?
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
哈哈,这个我有兴趣,可以加入吗?% ]; w4 Q \. y. J8 z/ ^$ p
本人有2年的STM32F103系列的编程系列,一般用Keil编译器,没玩过uCOS,可以向你请教吗?
没问题,同意加入,一起学习。* ]2 u$ N8 t& s9 h+ f
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
本人有多年单片机编程经验,并熟悉上位机VC++程序开发。
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
本人QQ:1058925707
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
报名! qq:78730460
本人有多年单片机编程经验,并熟悉上位机VC++程序开发。
4 i) F2 O* t, T1 t! s' f
感谢你的加入。
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
版主你好! 我接触M3才半年,目前在做电力方面这块 。对于你这个主题很是感兴趣,不过本人对系统和和上位机这方面没怎么接触过,一直以来做的就是硬件的驱动控制和一些数据处理。不知能否加入进来。
本人QQ:1058925707 4 C. t6 J5 d) K1 v0 V) ^) P3 \
& F {5 a- r* z$ }/ B& e
同意加入,一起学习
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
楼主你好,本人多年VC开发经验,可以完成上位机功能的开发,STM32 F103正在学习中,不知道小组还需要人手吗?
欢迎!. j3 \; i, s* t% F6 p% F
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
希望看到你们更多的更新和进步!