MAXQ3120电表参考设计的定制功能
时间:09-13
来源:互联网
点击:
具有额外功能的读写寄存器
还有一种应用情况,即你想让一个写事件触发额外的功能。为了达到这种效果,必须让寄存器管理器向额外任务发送一个消息,或者更新执行额外功能所涉及的RAM内容。作为样例说明,可在寄存器管理器中搜索C030,你会找到下面这段代码:
switch(Register.Word)
{
case 0xC030: // Meter constant, real
action_value = 0;
for(i=4; i>1; i--)
{
action_value *= 100;
action_value += (g_CommBuffer.Message[ i] & 0xf) +
(g_CommBuffer.Message [ i] >> 4) * 10;
}
set_E_pulse(action_value); // this will set E_pulse
break;
这段代码在EEPROM的寄存器数据更新完毕之后运行。在这个条件下,主机请求改变电表常数。存储在EEPROM中的电表常数寄存器更新过后,传输到通信缓冲器的毫秒数值被转换成内部电表单位,并通过set_E_pulse函数发送给DSP程序。
只读寄存器
一些只读寄存器只是简单地从EEPROM中读取数据(如用电量),并通过电表的其它进程来更新其中的数据。然而,另外一些只读寄存器(如RMS电压)并未存储在EEPROM内。这些寄存器数据存储在EEPROM内是没有任何意义的,而且如果这样做并连续更新数据,会迅速损耗EEPROM!你可以在ProcessRegisterNumber中的表格注释里找到这些寄存器,表述为“not stored in EEPROM”(未存储在EEPROM内)。
这些寄存器由寄存器管理器的GetSpecialRegister程序来控制。对应每个只读寄存器,程序都在switch分支选择语句中提供相应的条件。例如:
case 0xB611:// voltage (phase A)
g_MessageBoard.EEPROMOpPending = 1;
Request_RMS(RMS_VOLTAGE_REQUEST);
SpinTaskWheel();
while(!(DSP_CTRL & 0x20))
SpinTaskWheel();
*value = Get_RMS() / 1000;
g_MessageBoard.EEPROMOpPending = 0;
*size = 2;
break;
这个例子阐明了一个重要事实,即任何任务都不能挂起任务轮。case的第一条语句将消息板中的EEPROMOpPending标志位置为高。然后它要求DSP函数计算RMS电压值,并在DSP函数忙时递归调用任务轮。当EEPROMOpPending标志位置为高后,执行一次任务轮循环,并且不调用寄存器管理器,从而避免了无限递归。一旦DSP函数完成,将提取RMS值并清除EEPROMOpPending标志位。
请注意,对于这种类型的只读寄存器,不必在MAXQ3120RD.h文件中添加结构来保留EEPROM存储空间。也不必向ProcessRegisterNumber表添加成员。在处理基于EEPROM的寄存器之前,寄存器管理器主程序总要调用GetSpecialRegister。
定制DSP程序
参考设计的DSP程序是一套汇编语言模块,它负责处理从ADC到脉冲生成以及报告电压、电流、功率和用电量的整个信号流。大部分程序不需要修改,但也许你希望修改以下方面:
采用一个不同的电流或电压变换器,从而需要不同的增益因子。
改 变系统生成电表脉冲的方式。
改变前端滤波。
DSP程序是如何工作的,以及你可以安全地改变哪些单元,以下部分从较高的层次对此进行了说明。
注意:DSP模块以预编译的目标文件形式公开发布。只有在签署了保密协议(NDA)的情况下才可以提供汇编语言源代码。更多信息,请联系Dallas SEMiconductor/Maxim。
存储
DSP程序用到RAM空间的低地址部分。在DSP模块中搜索“Data Memory Map”,可以看到DSP程序用到的一系列RAM变量。前两个字节是一组控制DSP函数运行的数据位。
常数
可通过调整两个常数来设置电压和电流通道的满量程读数。它们分别是W_V_Scale和W_I_Scale。缺省情况下,这两个常量被设置为400V和250A。电压被设置为正常条件下不会超越的电平值(280VRMS以上),而电流设定值与可能的电表分流值相一致(250μ至500μ,典型值)。
接口程序
用户程序可以直接使用一些内置程序的返回值。如果可能,你应该通过这些内置程序与DSP函数接口,而不是直接与DSP函数使用的内部变量接口。
Get_and_Clear_Usage: 这是C代码用来提取电量累计值的主程序。通常情况下,需要对用电量进行累计时,DSP程序会通知异步事件管理器。然而,随时都可以调用这个程序以获取精确的用电量读数(截至当前)。注意,IAR编译器会自动传递A[0]内的函数参数,并将结果返回给A[0]。
Get_Frequency: 返回0.1mHz步长的线路频率。值得注意的是,这个子程序缺省情况下并未加载;DL/T 645标准并未要求频率结果。
Get_Power_Factor: 返回负载的功率因子。
Get_Power: 根据参数不同,返回无功或有功功率。
Get_MaxD: 返回自上次调用该函数后,电表记录的最大需量(功率)值。
Request_RMS: 根据参数不同,要求DSP计算RMS电流或电压值。
Get_RMS: 返回最近一次请求的RMS值。
set_E_pulse: 接受一个电表常数,并设置适当的DSP变量以使该电表常数生效。
中断服务程序
参考设计只使能了一个中断:就是AFE中断,ADC上有一组新的采样数据时产生该中断。因为ADC采样周期为48μs,实际上中断服务程序会很快地结束它的工作,并返回到主代码中―在两个中断之间只有384个指令周期!
中断服务程序执行以下功能:
生成输出脉冲:如果需要一个脉冲,则启动它。如果脉冲正在进行中,则递减持续时间计数器的值,并在计数器回零时终止脉冲。
累加求和:将最近的能量采样值累加到所有适当的寄存器中。
累计RMS值:如果被请求,则累计I2或V2。
检查电压下限:如果电压低于门限值,则递增一个计数器值。
过零检测:如果电压信号正向过零,则设置一个标志位。
还有一种应用情况,即你想让一个写事件触发额外的功能。为了达到这种效果,必须让寄存器管理器向额外任务发送一个消息,或者更新执行额外功能所涉及的RAM内容。作为样例说明,可在寄存器管理器中搜索C030,你会找到下面这段代码:
switch(Register.Word)
{
case 0xC030: // Meter constant, real
action_value = 0;
for(i=4; i>1; i--)
{
action_value *= 100;
action_value += (g_CommBuffer.Message[ i] & 0xf) +
(g_CommBuffer.Message [ i] >> 4) * 10;
}
set_E_pulse(action_value); // this will set E_pulse
break;
这段代码在EEPROM的寄存器数据更新完毕之后运行。在这个条件下,主机请求改变电表常数。存储在EEPROM中的电表常数寄存器更新过后,传输到通信缓冲器的毫秒数值被转换成内部电表单位,并通过set_E_pulse函数发送给DSP程序。
只读寄存器
一些只读寄存器只是简单地从EEPROM中读取数据(如用电量),并通过电表的其它进程来更新其中的数据。然而,另外一些只读寄存器(如RMS电压)并未存储在EEPROM内。这些寄存器数据存储在EEPROM内是没有任何意义的,而且如果这样做并连续更新数据,会迅速损耗EEPROM!你可以在ProcessRegisterNumber中的表格注释里找到这些寄存器,表述为“not stored in EEPROM”(未存储在EEPROM内)。
这些寄存器由寄存器管理器的GetSpecialRegister程序来控制。对应每个只读寄存器,程序都在switch分支选择语句中提供相应的条件。例如:
case 0xB611:// voltage (phase A)
g_MessageBoard.EEPROMOpPending = 1;
Request_RMS(RMS_VOLTAGE_REQUEST);
SpinTaskWheel();
while(!(DSP_CTRL & 0x20))
SpinTaskWheel();
*value = Get_RMS() / 1000;
g_MessageBoard.EEPROMOpPending = 0;
*size = 2;
break;
这个例子阐明了一个重要事实,即任何任务都不能挂起任务轮。case的第一条语句将消息板中的EEPROMOpPending标志位置为高。然后它要求DSP函数计算RMS电压值,并在DSP函数忙时递归调用任务轮。当EEPROMOpPending标志位置为高后,执行一次任务轮循环,并且不调用寄存器管理器,从而避免了无限递归。一旦DSP函数完成,将提取RMS值并清除EEPROMOpPending标志位。
请注意,对于这种类型的只读寄存器,不必在MAXQ3120RD.h文件中添加结构来保留EEPROM存储空间。也不必向ProcessRegisterNumber表添加成员。在处理基于EEPROM的寄存器之前,寄存器管理器主程序总要调用GetSpecialRegister。
定制DSP程序
参考设计的DSP程序是一套汇编语言模块,它负责处理从ADC到脉冲生成以及报告电压、电流、功率和用电量的整个信号流。大部分程序不需要修改,但也许你希望修改以下方面:
采用一个不同的电流或电压变换器,从而需要不同的增益因子。
改 变系统生成电表脉冲的方式。
改变前端滤波。
DSP程序是如何工作的,以及你可以安全地改变哪些单元,以下部分从较高的层次对此进行了说明。
注意:DSP模块以预编译的目标文件形式公开发布。只有在签署了保密协议(NDA)的情况下才可以提供汇编语言源代码。更多信息,请联系Dallas SEMiconductor/Maxim。
存储
DSP程序用到RAM空间的低地址部分。在DSP模块中搜索“Data Memory Map”,可以看到DSP程序用到的一系列RAM变量。前两个字节是一组控制DSP函数运行的数据位。
常数
可通过调整两个常数来设置电压和电流通道的满量程读数。它们分别是W_V_Scale和W_I_Scale。缺省情况下,这两个常量被设置为400V和250A。电压被设置为正常条件下不会超越的电平值(280VRMS以上),而电流设定值与可能的电表分流值相一致(250μ至500μ,典型值)。
接口程序
用户程序可以直接使用一些内置程序的返回值。如果可能,你应该通过这些内置程序与DSP函数接口,而不是直接与DSP函数使用的内部变量接口。
Get_and_Clear_Usage: 这是C代码用来提取电量累计值的主程序。通常情况下,需要对用电量进行累计时,DSP程序会通知异步事件管理器。然而,随时都可以调用这个程序以获取精确的用电量读数(截至当前)。注意,IAR编译器会自动传递A[0]内的函数参数,并将结果返回给A[0]。
Get_Frequency: 返回0.1mHz步长的线路频率。值得注意的是,这个子程序缺省情况下并未加载;DL/T 645标准并未要求频率结果。
Get_Power_Factor: 返回负载的功率因子。
Get_Power: 根据参数不同,返回无功或有功功率。
Get_MaxD: 返回自上次调用该函数后,电表记录的最大需量(功率)值。
Request_RMS: 根据参数不同,要求DSP计算RMS电流或电压值。
Get_RMS: 返回最近一次请求的RMS值。
set_E_pulse: 接受一个电表常数,并设置适当的DSP变量以使该电表常数生效。
中断服务程序
参考设计只使能了一个中断:就是AFE中断,ADC上有一组新的采样数据时产生该中断。因为ADC采样周期为48μs,实际上中断服务程序会很快地结束它的工作,并返回到主代码中―在两个中断之间只有384个指令周期!
中断服务程序执行以下功能:
生成输出脉冲:如果需要一个脉冲,则启动它。如果脉冲正在进行中,则递减持续时间计数器的值,并在计数器回零时终止脉冲。
累加求和:将最近的能量采样值累加到所有适当的寄存器中。
累计RMS值:如果被请求,则累计I2或V2。
检查电压下限:如果电压低于门限值,则递增一个计数器值。
过零检测:如果电压信号正向过零,则设置一个标志位。
C语言 电子 连接器 ADC 红外 LED LCD 电压 电流 DSP 显示器 电路 传感器 Maxim 相关文章:
- 嵌入C语言的测试驱动开发:为什么要调试?(05-06)
- TD-SCDMA终端射频测试与应用业务测试(06-02)
- 自适应信号发生器方案与实现(09-22)
- 基于混合建模的 SoC软硬件协同验证平台研究(02-20)
- 基于地源热泵便携式岩土热物性测试仪研制(07-09)
- HDNS2000光学感测芯片在运动检测中的应用(06-25)