|
学习主题:" \5 J# B2 ^1 y7 d2 E 设计一个以STM32F103C8T6为主控的小型多功能电子负载,程序使用uCOS嵌入式操作系统开发。 电子负载具有电源输出功能,能够模拟锂电池以测试充电器,并能测试各种电池的放电曲线。 希望通过此次设计来学习提高 STM32F103系列的编程应用能力。 9 B4 |1 o: ^5 r9 k6 F) F小组宣言:兴趣是提高自我的动力! 学习计划: 本 周——硬件电路设计(原理图)! P' H4 I' u8 |) ^ ( `3 B( I" U$ `! I7 F; U3 ?0 ?4 I6 ?3 }# K; w3 Z8 W0 ^1 ` 第二周——硬件电路设计(PCB) 第三周——硬件电路调试 & 底层硬件驱动程序调试(STM32F103 各种资源的学习与应用) 第四周——底层硬件驱动程序编写(STM32F103 各种资源的学习与应用) 后 期——完成总体程序编写工作, 产品调试、装配与测试 ; N! E, \1 V$ o 小组现有成员: xiao5333(负责硬件电路设计和STM32程序编写) 飘雨(负责部分底层硬件驱动程序编写) 2 ] S3 l6 h- |gdgly(负载上位机软件与通信协议编写) cmz871627(负责部分底层硬件驱动程序编写) $ G$ I$ s- x4 |, t4 Q8 t) M L$ l1 a 2 l1 K! F; \$ d( ^9 q 队员在招人数:2~5人(请想参加的童鞋加QQ讨论群61070251) 招募条件——有STM32F系列使用基础,能够使用uCOS编写程序 5 O7 M' ?2 ~8 l8 x+ B& p7 Q8 w, ]' Q 或 ; b. M! M& ?. K4 u. A% ]& m% p 能够使用C++或C#编写PC端软件 % _( L e2 h2 u6 ~, k1 K3 w* W: \' s( q& R. q5 K; H 招募待遇——所有小组成员免费赠送该制作的打样电路板一块(空板),有突出贡献者免费赠送成品电路板或STM32开发板 * P% c# |, v1 i! G 学习进度: 5月30日 方案制定完成(xiao5333) 6月1日 完成电子负载原理图设计(xiao5333) 6月5日 完成PCB图绘制,并外协加工 6月13日 电路调试完成 ; }# U9 X; T7 ?) K% C2 m4 b1 z6月14日 ADC底层硬件驱动 6月15日 底层硬件驱动编写完成 1 v8 S6 m' a6 u6月25日 完成总体程序编写工作 / l9 `. L/ @7 K' }6月25日 完成样机安装测试(实现初步功能) * q- z) C4 p+ k/ z, I% J J4 o1 G$ z. p y# x0 P 至此完成阶段性学习目标……^_^ 以后逐步完善细节和上位机通信功能。
/******************************************************************************************************************************************************/ # P3 d0 `/ Y' i; a1 ^, t & W" F% n% h+ K) L7 M% f ; X6 i$ t, B6 k ) G+ ]: T( G6 V8 Y$ `前言:& @: I9 d1 U2 U. R 现在的生活工作和各种电池、电源接触的机会是越来越多,可不靠谱的事情时有发生。) w7 r' q( Q4 E" O: t9 N/ m 如我前个月买个安卓智能手机,配的电池标称1800mAh,可用不了一天就没电了。使用公司的程控电池测试仪测试只有1300mAh,肯定是无良的奸商把原装电池换走了。要是手边有个小型便携的电子负载,当时就能测出容量大小,不用等公司的仪器空闲。哎……* g. k" w t8 {; f# F! W 趁现在工作不是很忙,设计一个小型多功能的电子负载吧! 可以电源输出调试电路,恒压恒流输出给锂电池充电,可以恒流负载测试电池、源出式恒压负载测试充电器(本设计的重点特色功能) 正好STM32社区有这个活动,希望能有一些志同道合和朋友一起完善这个小制作(当然不能亏待大家)。开始吧…… 6 h! b7 W3 h) P" R4 W$ \8 Q 1 ~6 Q; q D( Z# h 9 C: W: E' i( z: [7 w * T6 Y+ V: p6 R1 a 8 R( [; ] H# `0 C2 r8 |1 G8 K' V% Q- \ S 系统详细任务需求 主要功能:; T3 r: y" F" S" _$ _* [9 \; w 电源恒压、恒流输出模式;5 v7 R3 m8 w6 ~4 ?# g$ j+ p 恒压、恒流负载输入模式;- w. m& G+ x" Y1 g- l 恒压输出+恒压输入 充电器测试模式; 过压、过流、过功率、过热保护; LCD1602显示;$ o7 E. \# X# ]$ l" i* G1 [ 根据温度变化,智能风扇系统; 硬件设计规格:: @4 Q3 f3 Z5 e# {# f 输入% C' K. N7 t9 A 1.功率 50W2 F" Z' t1 X, _. m N 2.电流 0-5A 3.电压 1.5-30V4 L$ n' f* F0 k. h Y1 l# w 输出 1.功率 20W 2.电流 0-1A 3.电压 1.5-30V 尺寸重量! s2 T, B" _' c 体积能够装入普通废旧光驱壳内,重量小于1kg 硬件设计需求:, S+ Q1 q" w% x4 t' w% r0 h. h 主要实现输入输出的恒压、恒流控制,能够使用STM32设置参数 ( x/ V8 I3 k1 M0 j" V$ f/ l- n' Y STM32底层软件设计需求:" ^/ y# M9 \/ v! T 1.ADC采样反馈电压(主回路电压、电流、基准等). u$ |8 N, ]( C, H2 R% t 2.DAC使用PWM输出,通过占空比调节 3.键盘任务(STM32定时器自带编码器接口和普通按键) 4.LCD1602字符型液晶屏显示 5.LED和蜂鸣器控制$ G" o9 Z+ }( ?( _; d3 A9 y 6.继电器控制! |$ Q9 d3 `# Y J 7.1-Wire总线温度传感器通讯! |9 U) R& [( S" p+ n: C# @$ } 8.PID控制散热风扇7 h2 [8 p7 H6 z) u9 m; t 9.USB、串口通讯9 B2 W& t$ H8 D" V 由于系统较为复杂,采样uCOS嵌入式操作系统简化任务控制( Q) p8 ~6 [3 f' q* c# J, W" z |
微信公众号
手机版
请问楼主,本帖的工程文件还能否找到?能不能给我一份?2197746204@qq.com 感谢~@xiao5333
楼主的资料还有吗?发我一份751821725@qq.com
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
电源电路:, K, R S- z( J9 {2 s: e w
需要提供+12V/800mA(继电器和风扇),+5V/100mA(运放),+3.3V/100mA(STM32)3种电源电压。9 T9 g* a/ p0 ^8 U
开关电源芯片选用Ti的TPS5430输出大电流+12V电压,+5V和+3.3V要求电源纹波噪声尽量小,使用传统7805和1117稳压芯片提供。2 v, d# A' z' F# a5 N7 c; K
" {8 d) c% y( \: u |. E0 I9 _* T
恒流/恒压 反馈电路:
U4 将PWM-电流基准电压 (PWM_A)与U5的测量电流(ADC1)进行对比。如果PWM基准电压高于测量电流,则放大器输出为高,导通Q4。如果基准电压较低,则放大器输出为低,关断Q4。实现硬件输出恒流功能。
同理, 输出恒压与输入恒流、恒压电路实现方式一样。, J2 T% _* [* Q: {& W
* f9 U5 J, n8 G5 R! }. l9 Z& q
电压基准:
由于要求不是很高,使用较为廉价的TL431输出2.5V电压基准。, s/ w1 S/ K; }9 ~$ H
STM32主控:! g% \. }7 C/ ]
一句话,物尽其用啊!基本上这颗主控的资源都用到了,IO接口、ADC模数转换、PWM输出、定时器编码器接口、串口、USB等等。: j, _- I9 z. q; e
3 H& }8 ^" s W$ J8 s( q
STM32F103C8T6主控的资源分解图如下:; E- ?& l/ _4 e+ I/ p% o/ O
原理图:2 I, |; e/ [) a4 _. o: }4 O2 {
PCB画好了,今天发厂家做了……
收到板子了,硬件调试已经完成,有2个小bug,呵呵……: |2 `0 ~$ h3 I4 F
调试小结:! M0 r! y$ m4 b, M
4 ^4 G- ]0 W, ^3 ?
这个板子硬件有2个小bug:" M2 H6 i! f0 }- I8 U: f
BUG_01:
问题描述:Q2 MOSFET 的D、S极封装画反(^_^) . V t* ^! A6 x; p% t" B9 d$ ?5 m
BUG_02: O. T% G' E0 m: [! w/ V# u
问题描述:电池模拟负载模式下,输出恒压值有可能比输入负载恒压值偏高,导致上电后负载MOSFET直接导通。- O' |3 t# J+ x3 A" _
解决办法:降低输入负载恒压值,R26到U4C网络并一个1M电阻到GND(需要飞线)。/ F5 h J& ?" e0 w+ g
功率三极管和MOSFET必须用粗线从焊盘引出到散热器进行散热,注意绝缘。
7 G" Y6 g1 X/ S/ b5 p( n' E
调整参数如下:: S3 `7 e7 s( b3 M/ r8 V
1.R45不焊(VREF网络与PV断开);5 L" ]# w8 I8 H6 }
2.C18不焊,C27换成474,R27 10k换成100R(避免负载恒压震荡);
3.R1 10k换成100k;+ j" g' K/ g, t1 _: y8 c
4.R14 2K换成1.5K;(VIN * 0.13 = VFB)4 T* J$ d% ^/ U; |+ S; o
" j u% n+ ~3 c7 n
功能测试及外观图:
恒流负载,16V/3A。 电源显示电压和负载显示电压差为线上的压降。# ?$ a+ B+ M: H) Z0 D1 B
恒压负载 7.8V/2A
内部图片
背面图片,引出串口和RST/BOOT引脚,方便以后升级
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
01. 学习新建工程文件,编译器配置,如何使用外部有源晶振主时钟;2 t5 ^3 a( {0 d
s3 m8 H' U$ ]2 O5 I/ I
02. ADC硬件驱动函数:
有4个通道的模拟电压需要采样,分别是电压基准、输出/输入电压、输出电流、输入电流。9 Q; K& P2 ?/ ?8 l( y
STM32F103C8T6没有vref引脚,所以电压基准必须采样,用来换算VCC的电压。输出和输入电流值通过精密电流传感放大器转化为电压值,1A对应0.5V。多通道电压值通过DMA连续采样,减轻主控负担。4 f. T1 V( R( S9 I) o$ K- d
ADC硬件驱动函数,分解为ADC初始化函数、DMA初始化函数、电压基准测量换算函数、平均值滤波函数。
0 a6 w1 M* ^7 A- O
03. LED/蜂鸣器等IO硬件驱动函数:
这个就不解释了,注意部分IO需要屏蔽SWJ调试接口(SWJ配置失能,必须同时开启功能复用 IO 时钟)
/ t4 S* U5 U5 ~5 c
04. DS18B20温度传感器1-Wire硬件驱动函数:
按照单总线协议写就行。
( w5 `- x X l: s; Q# g, h
05. PWM-TIM3 硬件驱动函数:- ~7 F% w0 s1 u" s! S% E$ q
占空比可调,调节分辨率为6654 L- c+ N# K0 o4 T1 O
06. LCD1602 字符型液晶屏硬件驱动函数:
07. 增量型旋转编码器硬件驱动函数:
不得不说STM32的这个定时器扩展功能非常好用,配置好了基本上不占用主控资源
好了,至此本“STM32 多功能电子负载”的底层硬件驱动函数均已发布并测试通过,各位童鞋们可以直接在uCOS中调用。
如有不明白的地方欢迎在交流群中讨论,讨论的内容将汇总成学习记录。6 J! u- Z6 ]% ^5 p6 n8 H4 J
下周将正式使用uCOS搭建系统功能,敬请期待,谢谢~~~
uCOS任务分析:) R, ~, N' X2 B% y0 i6 E
首先申明本人也是初次使用uCOS编写程序,如有不妥之处敬请谅解。3 H0 d- @2 e7 A8 i, k. O% R
我编写了5个任务来完成设备的功能:8 }, @8 \' R) h) X3 m1 B
任务0:初始化任务,本任务完成一些硬件初始化和邮箱创建、其它任务创建工作,完成后任务自我删除。
void Task_Start(void *p_arg)
{% R, u) S( P* c& K0 e$ H
(void)p_arg; // 'p_arg' 并没有用到,防止编译器提示警告
SysTick_init();, e6 z) K9 I, @* g' y
OSTimeDlyHMSM(0, 0,1,0); //延时1s,等待电压基准稳定
Vref_Read(); //读取Vref3 R: E' X6 U$ @
Keybox = OSMboxCreate((void * )0); //创建消息邮箱7 w( T/ B& `3 l R
! ~3 Z+ N0 w9 s2 Q+ u2 q8 z
OSTaskCreate(Task_SELECT,(void *)0, //创建按键任务) i W# J, A1 l
&task_select_stk[TASK_SELECT_STK_SIZE-1], TASK_SELECT_PRIO);
OSTaskCreate(Task_MODE,(void *)0, //创建任务 模式切换任务
&task_mode_stk[TASK_MODE_STK_SIZE-1], TASK_MODE_PRIO);. u3 M! ?4 i/ k
OSTaskDel(OS_PRIO_SELF); //删除本任务: I. v' i# @" Z6 E1 q5 i R. Y& R
}
任务1:按键读取任务,取得按键值发送到邮箱! p% @3 W& C5 Z! |
void Task_SELECT(void *p_arg)* {! \0 ^1 F" N3 N
{
uint8_t key_tem = 0;8 c1 R7 |. ^! [& [9 D& s
(void)p_arg;8 f2 _! f$ ~- x& i2 Z9 E5 L
while (1)
{
OSTimeDlyHMSM(0, 0,0,50); //延时20ms
key_tem = KEY_GetChar(); //取得按键值
if(key_tem)
{
OSMboxPost(Keybox, (void *)&key_tem); //发送消息- u) A: u+ r( h4 ^# h* B- T
}
} : M6 l2 ^: ?& P% e% o; |
}& R- l' f& K9 V1 Z! D/ U
任务2:设置界面任务,本任务完成设置功能,进入输出显示任务后,自我删除。1 S2 S1 A% v* _$ V- R4 R
void Task_MODE(void *p_arg)
{
uint8_t err;
uint8_t key_dsp = 0, mode = 0;9 W5 `9 h: o6 H& b
char adc_v[]="";5 D* ~, {) K) v" k+ t
char adc_a[]="";* N3 Z$ m: Q1 W+ X8 N. X- y# H- _
int8_t mode_set = 0;. w6 `% C2 W' I
int16_t counter = 0;
uint16_t i_pulse = 0, v_pulse = 0;
(void)p_arg;
/* 默认恒流负载模式 */+ J* @7 v& p; J/ t3 V+ f6 B
GPIO_ResetBits(GPIOB, IO_K1_Pin);$ k8 J( c" a+ P8 L2 k/ u2 t6 b
GPIO_ResetBits(GPIOB, IO_K2_Pin);, x p8 G. {2 ?/ {3 B
GPIO_SetBits(GPIOB, IO_LOAD_Pin);
lcd_gotoxy(1,1);
lcd_puts("LCC");
lcd_gotoxy(5,1);
lcd_puts("SET");
sprintf(adc_a, "%5.2f", ((float)i_tem / 10)); //变量转化为字符串& Z9 s1 Q0 q- C* J0 h
lcd_gotoxy(10,2);
lcd_puts(adc_a); //显示字符串 电流值' @+ H* C `4 V. ]$ s. g
lcd_puts("A ");
while (1); s9 s& N9 f# e5 ?3 N
{
key_dsp = *(uint8_t *)OSMboxPend(Keybox, 200, &err); //等待消息 200个节拍(200ms)后进入就绪状态% }5 K/ I+ ~! G- l1 z5 L' j
! c5 J9 R1 w! f3 ^* p
// printf("DSP = %d\r\n", key_dsp);
1 m) \6 |9 T* {- w+ ^' [8 H/ t
switch (key_dsp)
{
case 1: //KEY_OUTPUT1 K* Q$ } n6 g: {# _ H
{
Output(1); //输出使能: ^4 G z' M. o J
lcd_gotoxy(5,1);+ X8 }. c% D/ E! o
lcd_puts("OUT");
User_Led_On(3);' o- R) i6 |1 d* n8 X6 i
GPIO_SetBits(GPIOB, IO_BR_Pin); //蜂鸣器开
OSTimeDlyHMSM(0, 0,0,100); //延时100ms
GPIO_ResetBits(GPIOB, IO_BR_Pin); //蜂鸣器关8 Q9 O% y# B' r j% D
2 i' o7 q$ p8 _5 f7 Z# _
OSTaskCreate(Task_OUTPUT,(void *)0, //创建任务 输出显示任务1 J5 _7 }) I( Z7 A0 h& s0 `) ^
&task_output_stk[TASK_OUTPUT_STK_SIZE-1], TASK_OUTPUT_PRIO);$ L. H' |' N) A
OSTaskCreate(Task_ENC,(void *)0, //创建任务 输出设置任务4 O4 y& r& e% W' g* P8 l
&task_enc_stk[TASK_ENC_STK_SIZE-1], TASK_ENC_PRIO);5 x) `- Y8 C4 m; X$ l8 w9 {
OSTaskDel(OS_PRIO_SELF); //删除本任务
break;
}
case 2: //KEY_ENC5 k$ _4 D' B# l( B
{5 d Q+ o) e) n' C5 ~1 P
if(mode) //电流,或其它调节模式 |7 [: x8 I. s& e8 j9 \& o; {
{3 ~) I/ L. Z O9 Z
mode = 0; //电压调节模式& f$ f4 [1 N/ P% m
}8 k8 ]- p4 h3 Z0 X6 k, ?
else mode = 1; //电流调节模式
break;! C+ `( f& j j% q4 j: e
}
case 3: //KEY_ENC_LONG! Z0 `, y! f6 U* M! u" H* A" F
{
mode = 2; //系统模式调节+ W3 I7 G9 z0 ?3 }
break;! \6 ]/ M* R: i: \2 o2 w) C
}
}0 s8 x) I/ n! S0 W1 l% Z& S. |
/ ^1 u# o# t9 M7 u' u
counter = ENC_GetCounter(); //取得ENC变量
ENC_CounterInit(); //计数初始化
& S" C# E4 Q. X1 |% \0 Z+ o
if(mode == 0) //电压调节模式
{0 c( k3 z9 O2 A5 {5 n- g5 L( X% w
v_tem += counter;
( u9 D4 \9 K3 |+ }8 Q" G; S3 S3 z |
if(v_tem
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
本人有2年的STM32F103系列的编程系列,一般用Keil编译器,没玩过uCOS,可以向你请教吗?
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
哈哈,这个我有兴趣,可以加入吗?
本人有2年的STM32F103系列的编程系列,一般用Keil编译器,没玩过uCOS,可以向你请教吗?
没问题,同意加入,一起学习。. E! _* S3 O" w& v9 O+ a3 G
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
本人有多年单片机编程经验,并熟悉上位机VC++程序开发。
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
本人QQ:1058925707
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
报名! qq:78730460& \& c; P0 Z1 I
本人有多年单片机编程经验,并熟悉上位机VC++程序开发。
5 ~6 e- @1 ^3 {" W' [; z% Q2 g" E
感谢你的加入。
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
版主你好! 我接触M3才半年,目前在做电力方面这块 。对于你这个主题很是感兴趣,不过本人对系统和和上位机这方面没怎么接触过,一直以来做的就是硬件的驱动控制和一些数据处理。不知能否加入进来。+ ~3 F9 z7 W! p$ Q
本人QQ:1058925707
) ^. ~" |) ~9 d C8 {& `
同意加入,一起学习
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
RE:【ST学习小组】STM32 多功能电子负载兴趣小组
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
楼主你好,本人多年VC开发经验,可以完成上位机功能的开发,STM32 F103正在学习中,不知道小组还需要人手吗?' @5 I. {' B( i2 Z2 r; m
欢迎!
回复:【ST学习小组】STM32 多功能电子负载兴趣小组
希望看到你们更多的更新和进步!