本帖最后由 harvardx 于 2016-9-18 10:34 编辑
如题, 申请时,表面,已经存在这样一个设计,因为从稳定性和平台选择多样性的角度, 欲多一个平台的选择, 顺道对比两者的性能差异和优劣, 同时也是为今后批量多一个供应商选择.
【KE02Z】基于KE02Z的三相交流功率,频率表的设计 https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=605721&fromuid=2039986 (出处: 恩智浦技术社区)
拿到开发板,就着手现有程序和硬件方面的移植工作.
一, 硬件方面
硬件的设计比较简单 ,因为是用在设备上用于观测输出情况, 计量精度没有特别要求,基本是在0.5或者1.0级左右.因此没有采用专用的电力计量IC, 因为是需要输出频率显示,所以采用了直接数字采样方案 ,功率部分是采用了 直接采样电压 ,电流的办法来实现, 把乘法工作交个单片机来运算, 功率表,也可以采样硬件乘法器的形式,将模拟的电压电流信号直接相乘,从而直接得到功率信号的直流电压.但硬件上易导致复杂化 庞大化, 综合考虑,采用了如今这样一种比较低廉的方案. 但是对硬件系统的要求比较高.首先 ,电压没有采用隔离采集 ,而是分压,桥整后 ,直接单片机交流采样. 电流采用了 隔离的霍尔 电流互感器. 隔离尚可, 但是此或者电流传感器,是直流的 .会输出与交流电流波形一致的直流电压信号. 因此在软件中,需要进行一个简单的算法处理 . 如此硬件处理, 相对来说 比较简易, 在满足性能要求的前提下,尽量简化. 也方便可以移植到不同的平台.初步的设想可以在大多数的8位机和M0 平台之间迁移.
二, 软件移植. 依附于硬件的简易性, 软件方面的移植也变得相对容易. 首先就是一个系统时钟节拍, 这个cortex的单片机都会有,为了通用,建议用一个普通的定时器代替. 现在的单片机普遍有3个以上的定时器. 例如: 常见的一个单片机定时实现,内含了多个时标定时,
- void TMR0_IRQHandler( void )
- {
- u08 i =0;
- /* Clear TIMER0 Timeout Interrupt Flag */
- _TIMER_CLEAR_CMP_INT_FLAG(TIMER0);
-
- /* 电流快速采集 */
- sample_current();
-
- //各个软定时器处/////////////////////////////////////////////////
- //10ms定时到=====================================================
- if( t0_cnt_10ms++ > 5 )
- {
- t0_cnt_10ms = 0;
- f10ms = true;
- }
- //20ms定时到=====================================================
- if( t0_cnt_20ms++ > 10 )
- {
- t0_cnt_20ms = 0;
- f20ms = true;
- }
-
- if( t0_500ms++ > 250 )
- {
- t0_500ms = 0;
- f500ms = true;
- }
-
- //1s级定时到=====================================================
- if( t0_1s++ > 500 )
- {
- t0_1s = 0;
- f1s = true; f500ms2 = true;
- }
-
- if( t0_1s_sample++ > 500 )
- {
- t0_1s_sample = 0;
- f1s_sample = true;
- }
-
- //////////////////////////////////////////
- //倒计时定时器处理
- for( i =0 ; i< TIMER_N; i++)
- {
- /* 软定时器1s到*/
- if( t0_cnt_1s[ i ]++ >= t0_cnt_1s_base[i] )
- {
- t0_cnt_1s[ i ] = 0;
- //////////////////////////////////////
- if( Timer[i].TR == ON )
- {
- //////////////////////////////////
- if( Timer[i].second-- == 0 )
- {
- //////////////////////////////
- if( Timer[i].minute-- > 0)
- {
- Timer[i].second = 60;
- }
- else
- {
- Timer[i].TF = true;
- }
- //////////////////////////////
- }/////////////////////////////////
- }/////////////////////////////////////
- }
- }
- //倒计时定时器处理
- //////////////////////////////////////////
- }
复制代码
简单的系统时钟如下, 提供了几个不同级别,溢出周期的时间标记. 用于前后台系统的控制 和系统的简单的定时工作,如下,可以方便的迁移到不同的单片机系统. 现代单片机的编程基本实现了C语言化,甚至是更加高级的语言,电工们关于用c还是汇编的争论得到自然剖析.ARM时代.你再牛B ,也不可能全部去汇编编程了(大牛除外), 大家帮更多的重心放在自己的实现. cortex- M为核心的新一代ARM单片机的出现, 极大的便利了入门者. 随着近几年CMSIS的发展普及随着各家固件库或者bsp的完善. 整个ARM单片机构建出了一份十分优良的单片机生态系统. 定时器你不会 ,请看厂家的固件库, 常用的协议你不会 ,请看标准库. 操控一个单片机,入门一个单片机不再困难,花上3-5小时,花上3-5天,实在不行3-5周, 就会很好的入门,说白了.现在的cortex-M为核心的单片机 不是亲兄弟就是表亲, 大同小异. 也是本项目的实现前提和目的之一.
看看 ,迁移一下 到底要付出什么代价,是不是如想象中那般便利 ,还是困难重重.第一篇,先到这里. 开始KE02Z的探索实践之旅.
|