基于LABVIEW和RL78评估板的心电图采集系统 创意进度贴+RL78 ad采集端程序发布
基于LABVIEW和RL78评估板的心电图采集系统创意进度贴+RL78 ad采集端程序发布
这个采集程序上周都已经完成了,本来想着和labview程序一起发布,怕到时帖子发了图片又给弄乱了,先发布RL78/G14的ad采集端程序吧。
选取AD采样的AIN3(P23)引脚作为采样的输入管脚,利用Applilet3 for RL78_G14产生AD的驱动程序。才开始直接采样总是出问题,后来发现是自己的配置错误,使用选择模式,而不是扫描模式就能解决问题。具体配置如下所示:
void R_ADC_Create(void)
{
ADCEN = 1U; /* supply AD clock */
ADM0 = _00_AD_ADM0_INITIALVALUE; /* disable AD conversion and clear ADM0 register */
ADMK = 1U; /* disable INTADinterrupt */
ADIF = 0U; /* clear INTADinterrupt flag */
/* Set INTAD low priority */
ADPR1 = 1U;
ADPR0 = 1U;
/* Set ANI0 - ANI3 pin as analog input */
PM2 |= 0x0FU;
ADM0 = _30_AD_CONVERSION_CLOCK_4 | _00_AD_TIME_MODE_NORMAL_1 |_00_AD_OPERMODE_SELECT;
ADM1 = _00_AD_TRIGGER_SOFTWARE | _00_AD_CONVMODE_CONSELECT;
ADM2 = _00_AD_POSITIVE_VDD | _00_AD_NEGATIVE_VSS | _00_AD_AREA_MODE_1 |_00_AD_RESOLUTION_10BIT;
ADUL = _FF_AD_ADUL_VALUE;
ADLL = _00_AD_ADLL_VALUE;
ADS = _03_AD_INPUT_CHANNEL_3;
}
同时在ADC_Start中添加 while(ADCS); ,等待系统AD配置完成,才进行下一步。
void R_ADC_Start(void)
{
ADCE = 1U;
ADIF = 0U; /* clear INTADinterrupt flag */
ADMK = 0U; /* enable INTADinterrupt */
ADCS = 1U; /* enable ADconversion */
while(ADCS);
}
然后编写中断服务函数,修改r_cg_adc_user.c中的函数如下:
__interrupt static void r_adc_interrupt(void)
{
/* Start user code. Do not edit comment generated here */
ADCS = 0U; /* disable ADconversion */
uart_adc_value();
/* End user code. Do not edit comment generated here */
}
中断服务函数调用了 uart_adc_value()函数,此函数原型如下:
void uart_adc_value(void)
{
int s,i;
uint8_t string[3]={'\r','\n'};
uint8_t start[3]="ST";
s=((long)(ADCR>>6)*5000)/1024;
uint16_ToString(adc_string_value,0,s);
while(R_UART2_Send(start,2));
while(R_UART2_Send(adc_string_value,4));
NOP();
while(R_UART2_Send(string,2));
}
其中的R_UART2_Send被我修改过,中间添加了延时函数,否则会传输不正常。
原型修改后如下所示:
/***********************************************************************************************************************
* Function Name: R_UART2_Send
* Description : This function sends UART2 data.
* Arguments : tx_buf -
* transfer buffer pointer
* tx_num -
* buffer size
* Return Value : status -
* MD_OK or MD_ARGERROR
***********************************************************************************************************************/
MD_STATUS R_UART2_Send(uint8_t * consttx_buf, uint16_t tx_num)
{
/* Declare a loop count variable */
uint16_t i;
MD_STATUS status = MD_OK;
if (tx_num < 1U)
{
status = MD_ARGERROR;
}
else
{
gp_uart2_tx_address= tx_buf;
g_uart2_tx_count = tx_num;
SMR10 |= _0001_SAU_BUFFER_EMPTY;
STMK2= 1U; /* disable INTST2 interrupt */
while(g_uart2_tx_count)
{
TXD2 =*gp_uart2_tx_address;
/* Allow for the transmission to complete */
for (i=0; i < 6000; i++)
{
/* Add 1 instruction delay */
NOP();
}
gp_uart2_tx_address++;
g_uart2_tx_count--;
// STMK2 = 0U; /* enable INTST2 interrupt */
}
}
return (status);
}
上述的函数uart_adc_value()由在主函数中的while循环中断调用adc_get_value()函数触发,adc_get_value函数原型如下:
void adc_get_value(void)
{
R_ADC_Start();
R_ADC_Stop();
}
上述程序经过改动编译后,调试运行结构都符合预期。然后下载程序到RL78/G14中的FLASH中,通过renesas flash programmer下载到芯片中,然后修改跳线帽使程序全速运行。
整体程序见附件中。
[
本帖最后由 youzizhile 于 2013-11-2 19:47 编辑 ]