This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430FG439:MSP430FG439 y 轴计算

Guru**** 667810 points
Other Parts Discussed in Thread: MSP430FG439, MSP430FG437
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/805399/compiler-msp430fg439-msp430fg439-y-axis-calculation

器件型号:MSP430FG439
主题中讨论的其他器件: MSP430FG437

工具/软件:TI C/C++编译器

您好!

我现在正在使用 MSP430FG439。 我从 LabVIEW_GUI (SLAA458)获得的数据非常好。 但是、SLAA458不允许我导出和保存数据。 因此、我现在尝试 自行编程。 我附上了 MSP430FG439软件和代码的图。 我的问题是:

1. y 轴的振幅如何超过2000? 编码部分显示不能超过255 (如下所示)。 那么、我在漂移如何进行计算以获取软件之类的数据?  

/* UART 传输- IR 心脏信号*/
开关(SCOLE_TYPE)

案例 SCOLE_TYPE_Heart 信号:
I =(ir_Heart _ac_signal >> 6)+ 128;
//饱和到一个字节
如果(i >= 255)//确保数据!= 0x0或0xFF
I = 254;// AS 0x0和0xFF 用于 SYNC
否则、如果(i <= 0)// LabVIEW GUI 中的字节
I = 1;

TXBUF0 = 0x00;//字节1 - 0x00 (同步字节)
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0xFF;//字节2 - 0xFF (同步字节)
while (!(IFG1 & UTXIFG0));
TXBUF0 = I;//字节3 - IR 心脏信号(仅交流)
while (!(IFG1 & UTXIFG0));
TXBUF0 = Heart Rate;//字节4 -心率数据
while (!(IFG1 & UTXIFG0));
TXBUF0 = SaO2_LSB;//字节5 -%SaO2数据
中断;

2.我可以使 y 轴成为输出电压吗? 如果是、您会告诉我如何执行该操作吗? 如果有任何帮助、我们将不胜感激!

//
//此程序按“原样”提供。 TI 不做任何保证或
//明示、默示或法定的表示,
//包括任何隐含的适销性、适用性保证
//对于特定用途,缺少病毒、准确性或
//响应的完整性、结果和缺乏疏忽。
// TI 拒绝任何所有权、安静享受、安静的保证
//拥有和不侵犯任何第三方
//与程序或相关的知识产权
//您对程序的使用。
//
//在任何情况下、TI 都不对任何特殊的、偶然的、
//无论造成的后果性或间接损害,都可能造成
//责任理论以及是否已向 TI 提出建议
//以任何方式产生此类损害的可能性
//本协议、程序或您对程序的使用。
//排除的损害包括但不限于的成本
//拆卸或重新安装,计算机时间,人工成本,损失
//商誉、利润损失、储蓄损失或损失
//使用或中断业务。 TI 的
//根据本协议或由产生的总责任
//您对该计划的使用超过了500美元
//(500美元)。
//
//除非另有说明,否则本程序是书面的,并且版权受版权保护
//由德州仪器(TI)作为“免费软件”分发。 您可以、
//仅在本计划中受 TI 版权保护的情况下,使用并修改
//无任何费用或限制地进行编程。 您可以
//分发给第三方,前提是您要传送
//将此许可证副本发送给第三方和第三方
//通过首次使用本计划同意这些条款。 您
//必须复制版权声明和的任何其它图例
//本程序的每个副本或部分副本的所有权。
//
//您确认并同意本计划包含的内容
//受版权保护的材料、商业秘密和其他 TI 专利
//信息并受版权法保护,
//国际版权条约和商业秘密法,如
//以及其他知识产权法。 保护 TI 的
//计划中的权利,您同意不反向反编译
//工程师、反汇编或以其他方式翻译任何目标代码
//将程序版本改为可读形式。 您同意
//在任何情况下,您都不会更改、删除或销毁任何内容
//计划中包含的版权声明。 TI 保留所有
//根据本许可未明确授予的权利。 除外
//如本协议中的具体规定,本协议中没有任何内容
//应解释为通过暗示、禁止反言、
//或者,在您的任何情况下,任何许可或其他权利
// TI 专利、版权或商业秘密。
//
//您不能在非 TI 器件中使用该程序。
//
//基于 MSP430FG437的脉动式血氧计演示-版本 II
// V. Chan 和 S. Underwood
/2005年5月
// Bhargavi Nisarga 修改
// 2008年4月
//与 Olimex 的 LCD 相关的所有修改均由进行
// Penko T. Bozhkov,Olimex 有限公司
// 2011年6月
//
#include
#include "stdint.h"
#include "intrinsics.h"
#include "math.h"

// LCD 段配置
#define seg_A 0x01
define seg_b 0x02
#define seg_c 0x04
#define seg_d 0x08
#define seg_e 0x40
define seg_f 0x10
define seg_g 0x20
#define seg_h 0x80

#define NUM_0 (seg_a | seg_b | seg_c | seg_d | seg_e | seg_f)
#define NUM_1 (seg_b | seg_c)
#define NUM_2 (seg_a | seg_b | seg_d | seg_e | seg_g)
#define NUM_3 (seg_a | seg_b | seg_c | seg_d | seg_g)
#define NUM_4 (seg_b | seg_c | seg_f | seg_g)
#define NUM_5 (seg_a | seg_c | seg_d | seg_f | seg_g)
#define NUM_6 (seg_a | seg_c | seg_d | seg_e | seg_f | seg_g)
#define NUM_7 (seg_a | seg_b | seg_c)
#define NUM_8 (seg_a | seg_b | seg_c | seg_d | seg_e | seg_f | seg_g)
#define NUM_9 (seg_a | seg_b | seg_c | seg_d | seg_f | seg_g)
#define NUM_A (seg_a | seg_b | seg_c | seg_e | seg_f | seg_g)
#define NUM_B (seg_c | seg_d | seg_e | seg_f | seg_g)
#define NUM_C (seg_a | seg_d | seg_e | seg_f)
#define NUM_D (seg_b | seg_c | seg_d | seg_e | seg_g)
#define NUM_E (seg_a | seg_d | seg_e | seg_f | seg_g)
#define NUM_F (seg_a | seg_e | seg_f | seg_g)


//
//与 Olimex 的 LCD 数字和初始化相关的定义!!!!
//
// Olimex LCD 数字10和11的定义
#define A 0x10
define b 0x01
define c 0x04
define d 0x08
#define e 0x40
define f 0x20
define g 0x02
define h 0x80
//显示数字10和11的字符生成器定义
const char char_gen_10_11[]={
A+b+c+d+e+f、// 0显示"0"
B+c、// 1显示"1"
A+b+d+e+g、// 2显示"2"
A+b+c+d+g、// 3显示"3"
B+c+f+g、// 4显示"4"
A+c+d+f+g、// 5显示"5"
A+c+d+e+f+g、// 6显示"6"
A+b+c、// 7显示"7"
A+b+c+d+e+f+g、// 8显示"8"
A+b+c+d+f+g、// 9显示"9"
};
//未定义
#undef A
#联合国发展基金 b
#undef c
#undef d
#联合国发展基金 e
#undef f
#undef g
#undef h

// Olimex LCD 数字8和9的定义
#define A 0x01
define b 0x02
define c 0x04
define d 0x80
#define e 0x40
define f 0x10
define g 0x20
define h 0x08
//显示数字8和9的字符生成器定义
const char char_gen_8_9[]={
A+b+c+d+e+f、// 0显示"0"
B+c、// 1显示"1"
A+b+d+e+g、// 2显示"2"
A+b+c+d+g、// 3显示"3"
B+c+f+g、// 4显示"4"
A+c+d+f+g、// 5显示"5"
A+c+d+e+f+g、// 6显示"6"
A+b+c、// 7显示"7"
A+b+c+d+e+f+g、// 8显示"8"
A+b+c+d+f+g、// 9显示"9"
};
//未定义
#undef A
#联合国发展基金 b
#undef c
#undef d
#联合国发展基金 e
#undef f
#undef g
#undef h

// Olimex LCD 数字1到7的定义。 在这里、每个数字定义需要2个字节
#define a 0x0080
define b 0x0040
define c 0x0020
define d 0x0010
define e 0x2000
define f 0x4000
define g 0x0402
define h 0x1000
//显示数字1到7的字符生成器定义
const int char_gen_1_7[]={
A+b+c+d+e+f、// 0显示"0"
B+c、// 1显示"1"
A+b+d+e+g、// 2显示"2"
A+b+c+d+g、// 3显示"3"
B+c+f+g、// 4显示"4"
A+c+d+f+g、// 5显示"5"
A+c+d+e+f+g、// 6显示"6"
A+b+c、// 7显示"7"
A+b+c+d+e+f+g、// 8显示"8"
A+b+c+d+f+g、// 9显示"9"
};
//未定义
#undef A
#联合国发展基金 b
#undef c
#undef d
#联合国发展基金 e
#undef f
#undef g
#undef h


int itobcd (int i)//将十六进制字转换为 BCD。

int bcd = 0;//
char j = 0;//

while (I > 9)//

BCD |=((i % 10)<< j);//
I /= 10;//
J +=4;
}//
返回(bcd |(i << j));//返回转换后的值
}// itobcd (i)


const unsigned char hex_table[]=

num_0、NUM_1、NUM_2、NUM_3、NUM_4、NUM_5、NUM_6、NUM_7、
num_8、NUM_9、NUM_A、NUM_B、NUM_C、NUM_D、NUM_E、NUM_F
};

int32_t mul16 (寄存器 int16_t x、寄存器 int16_t y);

//FIR 滤波器系数、用于从信号中去除50/60Hz 和100/120Hz
#if 0
静态 const Int16_t coeffs[9]=

5225、
5175、
7255、
9453、
11595、
13507、
15016、
15983、
16315
};
其他
静态 const Int16_t coeffs[12]=

688、
1283、
2316、
3709、
5439、
7431、
9561、
11666、
13563、
15074、
16047、
16384
};
#endif

// SaO2查找表
const unsigned int Lookup [43]={100、100、100、99、99、99、99、99、99、99、98、98、98、
98,97,97,97,97,97,97,97,96,96,96,96,96,95,95、
95、95、95、95、94、94、94、94、94、94、9、93、93};
//
//#define FIRST_STAGE TARGET_HIGH 3900
//#define FIRST_STAGE TARGET_LOW 3600
//#define FIRST_STAGE TARGET_HIGH_Fine 4096
//#define FIRST_STAGE TARGET_LOW_Fine 3500

// LED 目标范围
#define FIRST_STAGE TARGET_HIGH 3500
#define FIRST_STAGE TARGET_LOW 3000
#define FIRST_TARGET_HIGH_Fine 4096
#define FIRST_TARGET_LOW_Fine 2700
#define FIRST_STEP_STEP 5.
#define FIRST_STEP_FIN_STEP 1.

// UART 传输结构定义
枚举范围_type_e

SCOLE_TYPE_OFF = 0、
示波器_TYPE_Heart 信号、
示波器_TYPE_RAW_Signals、
示波器_TYPE_LED_DRIVE、
};
int scope_type = scope_type_Heart 信号;
//int scope_type = scope_type_raW_signals;

int ir_dc_offset = 2000;
int vs_dc_offset = 2000;
int ir_LED_level;
int vs_LED_level;
int ir_sample;
int vs_sample;
字符为_IR;
int ir_heart 信号;
int vs_Heart 信号;
int ir_hear_ac_signal;
int vs_Heart;ac_signal;
unsigned int rms_ir_Heart _ac_signal;
unsigned int rms_vs_Heart _ac_signal;
int32_t ir_2nd _dc_register = 0;
int32_t vs_2nd dc_register = 0;
unsigned long log_sq_ir_Heart ac_signal;
unsigned long log_sq_vs_Heart ac_signal;
unsigned long sq_ir_heart _ac_signal;
unsigned long sq_vs_Heart ac_signal;
unsigned int pos_edge = 0;
unsigned int edge_debounce;
unsigned int heart _port_counter;
unsigned int log_heal_signal_sample_counter;
unsigned int heart signal_sample_counter;

volatile unsigned int j;

/*结果*/
unsigned int hear_rate;
unsigned int hear_rate _LSB = 0;
unsigned int SaO2、Ratio;
unsigned int SaO2_LSB = 0;

/*函数原型*/
//unsigned long isqrt32 (寄存器 unsigned long h);
int16_t dc_estimator (寄存器 int32_t * p、寄存器 int16_t x);
int16_t ir_filter (int16_t sample);
int16_t vs_filter (int16_t sample);
void set_LCD (void);
void display_number (int value、int start、int width);
void display_pulse (int on);
void display_correcting (int x、int on);

空延迟(长周期){
while (cycles){cycles-;}

void main (void)

双 F1;
int32_t x;
int32_t y;

WDTCTL = WDTPW | WDTHOLD;
SCFI0 |= FN_4;// x2 DCO 频率,标称值8MHz
// DCO
SCFQCTL = 91;// 32768 x 2 x (91 + 1)= 6.03MHz
FLL_CTL0 = DCOPLUS + XCAP10PF;// DCO+设置、因此频率= xtal x D x
//(N + 1)
//循环、直到32kHz 晶体稳定
操作

IFG1 &=~OFIFG;//清除振荡器故障标志
对于(j = 50000;j;j-);//延迟

while (IFG1 & OFIFG);//测试示波器故障标志

//设置 GPIO
P1DIR = 0xFF;
P1OUT = 0;
P2DIR = 0xFF;
P2DIR |= BIT2 + BIT3;// P2.2和 P2.3 o/p 方向-
//驱动 H 桥中的 PNP 晶体管
P2OUT = 0;
P3DIR = 0xFF;
P3OUT = 0;
P4DIR = 0xFF;
P4OUT = 0;
P5DIR = 0xFF;
P5OUT = 0;
P6OUT = 0;

/*设置 LCD */
set_lcd();

/*第一放大器级-跨导配置*/
P6SEL |=(BIT0 | BIT1 | BIT2);//选择 OA0O
//-ve=OA0I0、+ve=OA0I1
OA0CTL0 = OAN_0 | OAP_1 | OAPM_3 | OAADC1;
OA0CTL1 = 0;

/*第二放大器级*/
P6SEL |=(BIT3 | BIT4);//选择0A1O 0A1I
//-ve=OA1I0、+ve=DAC1
//-ve=OA1I0、+ve=DAC1
// OA1CTL0 = OAN_0 | OAP_3 | OAPM_3 | OAADC1;
// OA1CTL1 = 0x00;
//内部反相输入
//连接到 OA0输出
OA1CTL0 = OAN_2 + OAP_3 + OAPM_3 + OAADC1;
OA1CTL1 = OAFBR_7 + OAFC_6;// OA 作为 inv 反馈放大器、内部
//增益= 15;

/*配置 DAC 1为放大器提供偏置*/
P6SEL |= BIT7;
DAC12_1CTL = DAC12CALON | DAC12IR | DAC12AMP_7 | DAC12ENC;
DAC12_1DAT = 0;

/*配置 DAC 0为 LED 提供可变驱动器*/
DAC12_0CTL = DAC12CALON | DAC12IR | DAC12AMP_7 | DAC12ENC;// Vref+、高速/电流、
// DAC12OPS=0 => P6.6 (引脚5)上的 DAC12_0输出*/
//将 P2.2和 P2.3配置到
//为 LED 提供可变驱动
P2OUT |= BIT2;//关闭 D2的电源
P2OUT &=~BIT3;//打开 D3的源
DAC12_0DAT = 3340;

//设置 LED 亮度的初始值
IR_LED_LEVEL = 1300;
VS_LED_LEVEL = 1450;

/*配置 ADC12 */
ADC12CTL0 &=~ENC;//启用转换
//打开 ADC12、和
//设置采样时间
ADC12CTL0 = ADC12ON + MSC + SHT0_4 + REFON + REF2_5V;
ADC12CTL1 = SHP + SHS_1 + CONSEQ_1;//使用采样计时器、单序列、
// TA1触发(SHS_1)、从 ADC12MEM0开始
ADC12MCTL0 = INCH_1 + SREF_1;// ref+=Vref、通道= A1 = OA0
ADC12MCTL1 = INCH_3 + SREF_1 + EOS;// ref+=Vref、通道= A3 = OA1
ADC12IE = BIT1;// ADC12MEM1中断使能
ADC12CTL0 |= ENC;//启用 ADC
ADC12CTL0 |= ADC12SC;//开始转换

/*配置计时器*/
TACTL = TASSEL0 + TACLR;// ACLK、清零 TAR、
TACCTL1 = OUTMOD_2;
TACCTL0 = CCIE;
//这样得出的采样率为
// 512sps
TACCR0 = 31;//在上执行两个通道
//每个512sps。
TACCR1 = 10;//允许有足够的时间
//信号在以前变得稳定
//采样
TACTL |= MC_1;//计时器 A 打开、向上计数模式

/*配置 USART,以便我们可以向 PC 报告读数*/
P2DIR |= BIT4;
P2SEL |= BIT4;

UCTL0 |= SWRST;
ME1 |= UTXE0;//启用 USART1 TXD
UCTL0 |= char;// 8位 char、SWRST=1
UTCTL0 |= SSEL1;// UCLK = SMCLK
UBR00 = 52;//从6.02MHz 开始115200 = 52.33
UBR10 = 0x00;
UMCTL0 = 0x45;//调制= 0.375
UCTL0 &=~SWRST;//初始化 USART

/*
//仅用于 Olimex 的 LCD 调试用途!
int j=999;
for (int i=0;i<10;i++){
延迟(700000);
Display_number (j、3、3);//小数位
display_number (j、7、3);//大数字
J = j-111;

set_lcd();
*

while (1)

_bis_SR_register (LPM0_bits + GIE);

/*心率计算*/
F1 = 60.0*512.0*3.0/(浮点) LOG_Heart 信号_sample_counter;
Heart Rate =(unsigned int) f1;
//Heart Rate = F1;
Display_Number (Heart Rate、3、3);
Heart Rate (心率) LSB = Heart (心率)和0x00FF;

/* SaO2计算*/
x = log_sq_ir_heal_ac_signal/log_heal_signal_sample_counter;
y = log_sq_vs_Heart、ac_signal/log_Heart、signal_sample_counter;
比率=(unsigned int)(100.0*log(y)/log(x));
IF (比率> 66)
SaO2 =查找[比率- 66];//比率- 50 (查找表偏移)- 16 (比率偏移)
否则(比率> 50)
SaO2 =查找[比率- 50];//比率- 50 (查找表偏移量)
其他
//SaO2 = 100;
SaO2 = 99;
Display_Number (SaO2、7、3);
SaO2_LSB = SaO2 & 0x00FF;


//计时器 A0中断服务例程
#pragma vector=TIMERA0_vector
_interrupt void Timer_A0 (void)

int i;
IF (((DAC12_0CTL 和 DAC12OPS))//演示板中启用 D2

//立即启用可视
// LED、以留出时间
//互阻抗放大器以实现稳定
DAC12_0CTL &=~DAC12ENC;
P2OUT &=~BIT3;//打开 D3的源
DAC12_0CTL &=~DAC12OPS;//禁用 IR LED、启用可见 LED
DAC12_0CTL |= DAC12ENC;
DAC12_0DAT = VS_LED_LEVEL;
DAC12_1DAT = VS_dc_offset;//加载运算放大器偏移值以查看
P2OUT |= BIT2;//关闭 D2的电源

Is_IR = 0;// IR LED 关闭

IR_SAMPLE = ADC12MEM0;//读取 IR LED 结果
I = ADC12MEM1;
//启用下一个转换序列。
//序列由 TA1启动
ADC12CTL0 &=~ENC;
ADC12CTL0 |= ENC;

//滤清器移开50/60Hz 电收集器,
//和100/120Hz 室内照明光学拾取器
IR_Heart 信号= IR_FILTER (I);
//过滤掉大 DC
传感器中的//组件*/
IR_Heart _ac_signal = ir_Heart 信号- dc_estimator (&ir_2nd _dc_register、ir_Heart 信号);

/*通过第二个运算放大器将 IR 信号置于范围内*/
如果(I >= 4095)

如果(ir_dc_offset > 100)
IR_dc_offset--;

否则、如果(I < 100)

如果(ir_dc_offset < 4095)
IR_dc_offset++;

sq_ir_heal_ac_signal +=(mul16 (ir_heal_ac_signal、ir_heal_ac_signal)>> 10);

//调整 LED 亮度以保持
//第一个产生的信号
//级处于我们的目标范围内。
//我们并不真正关心什么
//第一个值的确切值
//级是。 它们需要
//非常高,因为很弱
//信号将产生较差的结果
//在后面的阶段。 但是、
//确切值只能是
//在可能的范围内
//由下一个正确处理
//级。 *

if (ir_sample > first_stage_target_high)
||
IR_SAMPLE < FIRST_TARGET_LOW)

//我们超出目标范围
//开始踢开 LED
//右侧强度
//方向、让我们回到过去
//into range。 我们使用精细的步骤
//当我们接近目标时
//范围和编码器阶跃
//我们距离很远。
如果(ir_sample > first_stage_target_high)

if (ir_sample >= first_stage_target_high_fine)
IR_LED_LEVEL-= FIRST_STEP_STEP;
其他
IR_LED_LEVEL -= FIRST_STEP_FIND_STEP;
//钳位到 DAC 的范围
如果(ir_LED_level < 0)
IR_LED_LEVEL = 0;

其他

if (ir_sample < first_stage_target_low_fine)
IR_LED_LEVEL += FIRST_STEP_STEP;
其他
IR_LED_LEVEL += FIRST_STEP_FIND_STEP;
//钳位到 DAC 的范围
如果(ir_LED_level > 4095)
IR_LED_LEVEL= 4095;

/* UART 传输- IR 心脏信号*/
开关(SCOLE_TYPE)

案例 SCOLE_TYPE_Heart 信号:
I =(ir_Heart _ac_signal >> 6)+ 128;
//饱和到一个字节
如果(i >= 255)//确保数据!= 0x0或0xFF
I = 254;// AS 0x0和0xFF 用于 SYNC
否则、如果(i <= 0)// LabVIEW GUI 中的字节
I = 1;

TXBUF0 = 0x00;//字节1 - 0x00 (同步字节)
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0xFF;//字节2 - 0xFF (同步字节)
while (!(IFG1 & UTXIFG0));
TXBUF0 = I;//字节3 - IR 心脏信号(仅交流)
while (!(IFG1 & UTXIFG0));
TXBUF0 = Heart Rate;//字节4 -心率数据
while (!(IFG1 & UTXIFG0));
TXBUF0 = SaO2_LSB;//字节5 -%SaO2数据
中断;

示例 SCOLE_TYPE_RAW_ENAIN信号:
while (!(IFG1 & UTXIFG0));
TXBUF0 = ir_sample >> 4;
中断;
示例 SCOLE_TYPE_LED_DRIVE:
TXBUF0 = ir_LED_level >> 4;
中断;


/*跟踪心脏跳动*/
Heart _signal_sample_counter++;
IF (pos_edge)

如果(EDGE_去 抖< 120)

EDGE_去 抖++;

其他

如果(ir_heart _ac_signal <-200)

EDGE_去 抖= 0;
POS_EDGE = 0;
DISPLAY_PULSE (0);



其他

如果(EDGE_去 抖< 120)

EDGE_去 抖++;

其他

如果(ir_heart _ac_signal > 200)

EDGE_去 抖= 0;
POS_EDGE = 1;
DISPLAY_PULSE (1);
//display_correcting (1、0);
如果(+Heart (+Heart)_Bear_counter >= 3)

LOG_Heart、signal_sample_counter = Heart、signal_sample_counter;
log_sq_ir_heart ac_signal = sq_ir_heart ac_signal;
log_sq_vs_Heart、ac_signal = sq_vs_Heart、ac_signal;
Heart _signal_sample_counter = 0;
SQL_IR_Heart;AC_SIGNAL = 0;
SQL_VS_Heart:AC_SIGNAL = 0;
Heart Bear_counter = 0;
_BIC_SR_IRQ (LPM0_Bits);
//大致执行虚拟唤醒
//每2秒





否则、//D3在降级板中启用

//立即启用 IR LED,
//为留出时间
//互阻抗放大器以实现稳定*/
DAC12_0CTL &=~DAC12ENC;
P2OUT &=~BIT2;//打开 D3的源
DAC12_0CTL |= DAC12OPS;//禁用可见 LED,启用 IR LED
DAC12_0CTL |= DAC12ENC;
DAC12_0DAT = IR_LED_LEVEL;
DAC12_1DAT = ir_dc_offset;//为 IR 加载运算放大器偏移值
P2OUT |= BIT3;//关闭 D2的电源

Is_IR = 1;// IR LED 亮起

VS_SAMPLE = ADC12MEM0;//读取可见的 LED 结果
I = ADC12MEM1;

//启用下一个转换序列。
//序列由 TA1启动
ADC12CTL0 &=~ENC;
ADC12CTL0 |= ENC;


//过滤掉50/60Hz 电气频率
//pickup 和100/120Hz 室
//照明光学拾取器*/
VS_Heart 信号= VS_FILTER (I);
//过滤掉大 DC
来自传感器的//组件*/
VS_Heart AC_SIGNAL = VS_Heart 信号- dc_estimator (&Vs_2nd dc_register、VS_Heart 信号);

/*通过第二个运算放大器使 VS 信号处于范围内*/
如果(I >= 4095)

如果(Vs_dc_offset > 100)
VS_dc_offset--;

否则、如果(I < 100)

如果(Vs_dc_offset < 4095)
VS_dc_offset++;

SQL_VS_Heart:ac_signal +=(mul16 (VS_Heart:ac_signal、VS_Heart:ac_signal)>> 10);

如果(Vs_sample > FIRST_TARGET_HIGH
||
VS_SAMPLE < FIRST_TARGET_LOW)

/*我们超出目标范围*/
//display_correcting (1、1);
如果(Vs_sample > FIRST_TARGET_HIGH)

if (Vs_sample >= first_stage_target_high_fine)
VS_LED_LEVEL -= FIRST_STEP_STEP;
其他
VS_LED_LEVEL -= FIRST_STEP_FIND_STEP;
如果(VS_LED_LEVEL<0)
VS_LED_LEVEL = 0;

其他

如果(Vs_sample < FIRST_TARGET_LOW_Fine)
VS_LED_LEVEL += FIRST_STEP_STEP;
其他
VS_LED_LEVEL += FIRST_STEP_FIND_STEP;
IF (VS_LED_LEVEL> 4095)
VS_LED_LEVEL = 4095;






#pragma vector=ADC_vector
_interrupt void ADC12ISR (void)

ADC12IFG &=~BIT1;//清除 ADC12中断标志
DAC12_0DAT = 0;//关闭 LED
DAC12_1DAT = 0;
//完全关闭 H 桥
if (IS_IR)//如果 TA0 ISR 中的 IR LED 亮起
P2OUT |= BIT2;// P2.2 = 1
否则//否则、如果 VS LED 在 TA0 ISR 中打开
P2OUT |= BIT3;// P2.3 = 1

int16_t ir_filter (int16_t sample)

静态 int16_t buf[32];
静态 int 偏移= 0;
int32_t z;
int i;
//硬高于几赫兹的滤波器、
//使用对称 FIR。
//这具有良性相位
//Characteristics */
buf[offset]=采样;
z = mul16 (coeffs[11]、buf[(offset - 11)& 0x1F]);
对于(I = 0;I < 11;I++)
z += mul16 (coeffs[i]、buf[(offset - i)& 0x1F]+ buf[(offset - 22 + i)& 0x1F]);
偏移=(偏移+ 1)& 0x1F;
返回 z >> 15;

int16_t vs_filter (int16_t sample)

静态 int16_t buf[32];
静态 int 偏移= 0;
int32_t z;
int i;

//硬高于几赫兹的滤波器、
//使用对称 FIR。
//这具有良性相位
//Characteristics */
buf[offset]=采样;
z = mul16 (coeffs[11]、buf[(offset - 11)& 0x1F]);
对于(I = 0;I < 11;I++)
z += mul16 (coeffs[i]、buf[(offset - i)& 0x1F]+ buf[(offset - 22 + i)& 0x1F]);
偏移=(偏移+ 1)& 0x1F;
返回 z >> 15;

/*unsigned long isqrt32 (寄存器 unsigned long h)

寄存器 unsigned long x;
寄存器 unsigned long y;
寄存器 int i;

//计算一个32位平方
32位整数的//根、
//其中前16位
结果的//是整数
部分结果和
//低16位是小数。
X =
y = 0;
对于(I = 0;I < 32;I++)

X =(x << 1)| 1;
如果(y < x)
X -= 2;
其他
y -= x;
X++;
Y <<<= 1;
IF ((h & 0x8000000))
Y |= 1;
h <<= 1;
Y <<<= 1;
IF ((h & 0x8000000))
Y |= 1;
h <<= 1;

返回 x;
}*/

int16_t dc_estimator (寄存器 int32_t * p、寄存器 int16_t x)

/*噪声形状直流估算器。 *
*p +=(((((int32_t) x << 16)-*p)>> 9);
返回(* p >> 16);

/*液晶屏数字显示*/
void display_number (int value、int start、int width)

/*
unsigned int i;
unsigned int 输出;
char * PLCD =(char *)&LCDMEM[7-start];

对于(I = 16、输出= 0;I;I-)// BCD 转换、16位

输出=_bcd_add_short (输出、输出);
IF (值和0x8000)
输出=__bcd_add_short (输出,1);
值<<= 1;


对于(i = 0;i <宽度;i++)//处理4位数字

* PLCD++= hex_table[输出和0x0F];//段到 LCD
输出>=4;//处理下一个数字

*

value = itobcd (value);

if (start ==3){
//显示心率
LCDMEM[2]= char_gen_10_11[值和0x0F];//显示当前心率单位-> LCD 数字11
LCDMEM[3]= char_gen_10_11[(value & 0xf0)>> 4];// tens -> LCD digit 10
LCDMEM[4]= char_gen_8_9[(value & 0xf00)>> 8];//数百-> LCD 数字9

否则、如果(start =7){
//显示氧化
LCDMEM[7]=((char)(char_gen_1_7[值和0x0F]>>8);// LCD ->数字7高字节
LCDMEM[6]=((char)(char_gen_1_7[值和0x0F]&0x00FF);// LCD ->数字7低字节
LCDMEM[9]=((char)(char_gen_1_7[((value & 0xf0)>> 4)]>8);// LCD ->数字6高字节
LCDMEM[8]=((char)(char_gen_1_7[((value & 0xf0)>> 4)]&0x00FF);// LCD ->数字6低字节
//不显示大于99的值
//LCDMEM[11]=((char)(char_gen_1_7[((value & 0xf00)>> 8)]>8);// LCD ->数字5高字节
//LCDMEM[10]=((char)(char_gen_1_7[((value & 0xf00)>> 8)]&0x00FF);// LCD ->数字5低字节



/* LCD 脉冲显示*/
void display_pulse (int on)

如果(接通)
LCDMEM[1]= 0xF0;//检测到心跳在 LCD 上启用“<^”
其他
LCDMEM[1]= 0x00;//禁用 LCD 上的"<^>"以实现闪烁效果

/*液晶屏校正信息显示*/
void display_correcting (int x、int on)

如果(接通)
LCDMEM[3]|=(x)? Seg_a:seg_d);
其他
LCDMEM[3]&=~(x)? Seg_a:seg_d);

/*配置 LCD */
void SET_LCD (void)

volatile unsigned int i;
for (i=0;i<20;i++)//清除 LCD 内存

LCDMEM[i]= 0x00;

/*打开 COM0-COM3和 R03-R33引脚*/
P5SEL |=(BIT7 | BIT6 | BIT4 | BIT3 | BIT2);

LCDCTL = 0x7F;//选择的功能:模拟发生器打开
// AG 的低阻抗
// 4Mux 激活
//所有输出为段
// S0-S23是 LCD 段线
BTFRFQ0;//开始基本计时器1s + LCD 64Hz

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    如果要传输超过2000的值、可以将其拆分为两个字节、并按如下方式单独传输它们。 LabView GUI 接收这两个字节并将其组合为一个16位数字。  

    无符号短整型 I;
    无符号字符 LSB、MSB。
    
    I = 2000;
    LSB = I&0xFF;
    MSB =(I>>8)&0xFF;
    
    TXBUF0 = LSB;//字节1 - 0x00 (同步字节)
    while (!(IFG1 & UTXIFG0));
    TXBUF0 = MSB;//字节2 - 0xFF
    (同步字节) while (!(IFG0 & UTXIFG0); 

     2.是的、可以。 您可以通过 MCU 根据 ADC 原始值计算电压、并将其传输到 LabView GUI 或在 LabView 中进行计算。

    电压= Vref*ADC_Raw/2^N N 是 ADC 分辨率位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、冬季、

    感谢您的回复! 它真的很有帮助! 您是否有用于电压计算的基准? 我想让我的项目更可信。 谢谢!

    最棒的  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、冬季、

    我已经搜索了电压器件、现在我已经了解了它。 另一个问题是、公式中的电压值是否仅为交流信号(消除了脉冲速率的直流信号)? 我计算了 MSP430FG439的电压分辨率、即0.6mv (Vref=2.5V、N=12)。 我想知道输出电压值的限制。 那么、您对 ADC_Raw 值的范围有什么想法吗?  感谢您的帮助!

    最棒的

    Sue

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不可以、公式中的电压值是信号的电流样本、无论交流还是直流。  ADC_Raw 值的限制为0-(2^N-1)。