|
本设计: 基于STM32与ATT7022E多功能电力监测仪的电路方案设计 程序编译器:keil 5 编程语言:C语言 编号C0016
2 M' o U( s1 _4 s4 [8 D7 U 近年来随着我国国民经济的高速发展,先进嵌入式处理器技术、微电子技术及测控技术也得到了快速发展 ,为了适应新形势的发展和需求,政府对智能电网的不断推进,对电力监测仪的实时性、可靠性、精确性,提出了更高的要求。 传统电力监测仪广泛采用AD+MCU模式,即外部模数A/D转换芯片与8位、 16位单片机进行对三相电网数据进行采集,存在许多的弊端,如芯片功能单一,需要进行外围扩展诸多器件,软件程序算法复杂,测量精度不高等问题。而以DSP+MCU双CPU模式,很好的解决了复杂数据的处理问题,但存在开发成本过高,且造成MCU资源的一定浪费;本系统通过采用高性能 32位ARMCortex-M3内核为处理器STM32F103ZE作为主控芯片与多功能高精度的三相电能专用计量芯片ATT7022E ,使系统整体硬件的设计更加简洁,与以往电力监测仪系统处理性能力得到明显提高,同时也降低程序算法复杂度。 " D3 _. \5 q" a$ J4 X9 X! _
9 _! ]7 y# t. I1 I% `# j$ t
原理图(提供PDF):
( ^' i5 E+ J1 `/ E
模块底板原理图(提供PDF):
& R8 S3 Y2 X( h" {
. I$ p! t( s6 _
PCB(提供PDF):
) A1 D4 a& z) v' V/ Z
6 v" `& }; r- g+ ^7 S
模块底板PCBS(提供PDF):
8 `3 W" }' @3 ~8 ^! @
+ L. T; {9 V. L7 }4 d
源程序(提供源文件):
! N& \7 J/ {. o% f6 \; @以下为部分程序,完整程序可在下载链接获取:
- int main(void)( n7 K: s/ f+ h1 @) t! G" v
- {. m' o- E/ K5 x$ n" |
- SCB->VTOR = FLASH_BASE; ' i( Z5 T/ R& x1 V6 b5 v5 q, l
- System_Init(); //底层初始化
1 {$ @, G- m( m* x3 b - OSInit(); //UCOSII初始化+ r5 R& S" K- ?8 k0 \8 C
- OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务$ a* j# N& k+ }% z, v% e
- 1 _/ g, ^6 T& V: P& X9 Z
- OSStart(); //启动UCOSII多任务管理
! W2 v. s8 L4 l- ] M - }
$ z4 j0 g% v; j F - /***************************************************************************/
7 Z C# _% c/ P2 L1 Z2 L+ D1 X - //*******函数名:start_task()
7 q! X& O: ^& b, Y9 B$ A: A - //*******说 明:起始函数+ N) ^2 A$ G: H4 D" k7 ~ o5 p5 ^9 U
- //*******参 数:UCOSII函数入口; a; s" v7 G: l, R* V u
- //*******返回值:无返回* x+ b3 Q( p6 O! }5 J, J* O
- /***************************************************************************/! o. l7 d' X; F
- void start_task(void *pdata)
, X4 k c' L6 Y1 G5 Y - {
4 P9 j1 b8 j& t7 U( N0 { - OS_CPU_SR cpu_sr=0;
' R8 A$ p1 f) }4 D) J" [ - pdata=pdata;
: k' S9 S5 F% Z - sem_rtc =OSSemCreate(0); //创建一个信号量用于RTC时钟* l/ d8 b( t) {$ C
- OSStatInit(); //初始化统计任务
1 Y0 l C# s% V5 e; Y* c - OS_ENTER_CRITICAL(); //进入临界区
9 O: H& W4 d8 d( @ - 1 p. A' \) C- i
- OSTaskCreate(main_task,(void *)0,(OS_STK *)&MAIN_TASK_STK[MAIN_STK_SIZE-1],MAIN_TASK_PRIO); //创建主任务$ v1 q3 d5 W" k; B6 F5 X: ]; x! k. q
- // OSTaskCreate(rtc_task,(void *)0,(OS_STK *)&RTC_TASK_STK[RTC_STK_SIZE-1],RTC_TASK_PRIO); //创建RTC任务
- y& E( m ^2 i9 s - OSTaskSuspend(START_TASK_PRIO); //挂起起始任务
+ Q1 R$ p8 m4 P9 O" H - OS_EXIT_CRITICAL(); //退出临界区% x! [8 M; |1 l7 ?
- }# J9 Z8 ?% ~2 J$ Z- G
- : w/ c! r( T; U* {
- 7 C3 Y2 ~, X; }7 R( N
- /***************************************************************************/
! {/ Z0 m( M0 `& K* ` J D - //*******函数名:main_task()
% x! w/ \, V- L - //*******说 明:UCOSII主函数,处理杂事
- I5 Z$ m0 C3 A a, C! s; o - //*******参 数:无参数
% I0 a# S* c/ u, w$ [( S9 G - //*******返回值:无返回
) b+ o0 a- a x5 s" c/ ?! q - /***************************************************************************/
4 M1 P" \* y5 M3 O2 R - void main_task(void *pdata)
5 B, J# K" W- w' {6 g7 D- w - {
, V* m4 z) ]) u$ b9 l! ]5 s1 x2 S8 } - while(1)) m( q. [# e2 x2 |) R( X
- { , Z1 Q q+ \; g
- DisposeKey(); //读取按键
% F9 r+ x+ [& t% o - , Z' C& S4 T# L( t8 B
- key_scan(); //按键扫描处理$ Q* C. {! |* ~) z7 U" W6 H
-
6 L0 N4 @9 R) ?7 B1 `+ \5 r$ } - if(TimingMark == 10) //500ms定时标志位
: |4 K/ q& [3 O8 B8 M# d7 J1 `: O - {1 N& D0 x/ e$ x5 M2 i! L
- TimingMark=0;( q! J. U: F5 X- j# d4 o
-
3 z: Z A( [2 e# n e; h9 t - ReadAmmeterData(); //读取内部电表数据
. |3 T2 b( M4 E- {. M - ( Q% l3 A6 i4 Y. Z7 B
- UpdateLcdMark = 1;
; P) Q* w( C/ Q; ` - }
% p, t' p- ` Q# U+ ~! N7 R -
2 j: C3 n3 ~5 X# s/ u! a: L! c; e - if(UpdateLcdMark == 1) //判断是否要更新数据/ Y$ l j; k( S. ]" X0 y t# @
- {# x3 N8 S6 p2 d9 d# N4 P
2 {4 |0 X8 T, I8 R3 P& ~0 s; `! F; x- clear_screen(); //清屏2 S9 T' _/ t( S9 R- r& i
) L& U) `) {2 V$ _7 z- Display_lcd(); //更新显示数据 0 {- ?9 W( ^8 K5 o2 z8 f3 I% L
-
1 V0 Z8 p% R; J3 Q( c! d - UpdateLcdMark = 0;
, x& a" m% ]# L' { ~& |7 Q3 } - }
+ V! r( m: e) i: g, p( p" b, c - , k' p5 n* i5 l$ K! G E
- " L! g; q( L5 }( r8 r3 {
- }2 z8 k" J0 E" g1 y4 u7 n
- $ y R0 A5 |6 Y
- }
复制代码 ( U/ r( w+ R( n5 e% J3 m
|