使用瑞萨R5F10368做一个简单的温度采集和电流采集

主要是记录一下瑞萨单片机遇到的坑,虽然之前也用过瑞萨但是时间长了就忘了,记录一下方便一下以后再用

瑞萨R5F10368介绍

在
使用的是20pin的 LSSOP封装的,如果没有做PCB板子的需要买一个芯片烧录底座,这里就遇到了第一个坑 买烧录器的时候一定要看清楚芯片封装规格 LSSOP(0.65 mm pitch)
在这里插入图片描述

硬件介绍

直接上图
在这里插入图片描述
三路的温度探头、一路的电流检测的霍尔传感器,还有两个LED灯用来输出状态

烧录器链接

烧录器的连接呢也有很多的坑
使用的是EZ-Cube仿真器
VCC---------板子VDD
GND---------板子VSS
FLMD0------板子TOOL0
RESETOUT----板子RESET
仿真器链接的时候板子是不工作的,因为会把RESET引脚拉高导致整个板子复位状态
如果你需要使用仿真器供电工作的话,可以把除了VCC和GND的引脚拔掉

程序部分

配置部分

使用的是CubeSuit+ 也就是CS+ 瑞萨的IDE
非常棒的代码生成功能,个人觉得比STM32CubeMX生成的代码还简洁,几乎都是对寄存器的直接操作,还有用户接口层方便使用开发
在这里插入图片描述
这个直接先Fix setting就行
在这里插入图片描述
我这里使用的是内部时钟,一共就一两块的单片机实现简单的功能没必要搞个外部晶振。
其他的Port Timer这些就按照自己的实际使用情况来设置。
注意一点这里,IDE是默认配置打开了看门狗的,但是这个看门狗好像不是那么好用,不知道是因为我使用内部时钟喂狗不准确还是怎么了,反正就是莫名其妙的复位
不建议打开
在这里插入图片描述
总的配置就差不多这样

代码
void R_Systeminit(void)
{
    PIOR = 0x00U;
    R_CGC_Get_ResetSource();
    R_CGC_Create();
    R_PORT_Create();
    R_SAU0_Create();
    R_ADC_Create();
    R_TAU0_Create();
    IAWCTL = 0x00U;
}

当你配置好了你所需要的板上资源生成代码以后,在r_systemint.c这个文件将你所配置的东西都调用,打开对应寄存器配置对应寄存器都在这个函数里面,这个是自动生成的不用我们去写的哈

void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    R_UART0_Start();
    R_ADC_Set_OperationOn();
   
    /* End user code. Do not edit comment generated here */
}

这个函数也是自动生成的,这个就是用户层的初始化了,比如我使用到了串口0,我就需要在这里面 R_UART0_Start();将串口打开, R_ADC_Set_OperationOn();开机AD转换。

瑞萨里面生成的代码是没有像STM32CubeMX一样有HAL库的 HAL_Delay可以直接使用的
所以需要自己写一个延时函数,为了使用高精度定时我就用定时器来做延时了
配置好一个一毫秒的定时器,非常简单的实现高精度延时

uint16_t delayms = 0; //放在定时中断中使用
void delay(uint16_t ms)
{
   R_TAU0_Channel0_Start();
   while(delayms < ms)
   	{
   	  ;
   	}
   delayms = 0;
   R_TAU0_Channel0_Stop();
}

获取AD采样值函数,这里要注意 这个单片机是16位的单片机,所以只能支持10位采样精度。

uint16_t ADValue;
uint16_t Get_ADC_VA(uint8_t CH)//获取采样值
{
	
	switch (CH)
	{
	   case 0:
	    ADS &= 0x00;
	    ADS = 0;
	    R_ADC_Start();   
            while (!ADIF);
	    ADIF = 0U; 
	    R_ADC_Get_Result(&ADValue);
	   break;
	   case 1:
	    ADS &= 0x00;
	    ADS = 1;
	    R_ADC_Start();   
            while (!ADIF);
	    ADIF = 0U; 
	    R_ADC_Get_Result(&ADValue);
	   break;
	   case 2:
	    ADS &= 0x00;
	    ADS = 2;
	    R_ADC_Start();   
            while (!ADIF);
	    ADIF = 0U; 
	    R_ADC_Get_Result(&ADValue);
	   break;
	   case 3:
	    ADS &= 0x00;
	    ADS = 3;
	    R_ADC_Start();   
            while (!ADIF);
	    ADIF = 0U; 
	    R_ADC_Get_Result(&ADValue);
	   break;
	   default:
	   break;
	   
	}
	return ADValue;    	    	             	    
}
uint16_t AD_VAL_ARG(uint8_t CH,uint8_t times)//简单的均值滤波
{
	uint8_t i;
	uint16_t count=0;
	if(times>60)times=60;
	for(i=0;i<times;i++)
	{
	  count += Get_ADC_VA(CH);
	  delay(1);
	}
	return count/times;
}

在选取通道的时候只需要对ADS寄存器进行复制就行 我这里先清空再赋值。ADIF是采样完成的一个标志寄存器,确保每次采样完成。然后直接调用 R_ADC_Get_Result(&ADValue);就可以读取到采样值了,我这里方便调试实时查看 我就定义了全局变量,因为单片机空间不大很容易出现内存溢出,这里不建议这么做。

void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
   
    while (1U)
    {
	  
	  
	    num[0] = AD_VAL_ARG(0,20);
	    temp[0] =  num_to_temperature(num[0]);	     
	    
	    num[1] = AD_VAL_ARG(1,20);
	    temp[1] = num_to_temperature(num[1]);
	    
	    num[2] = AD_VAL_ARG(2,20);
	    temp[2] = num_to_temperature(num[2]);
	    
	    num[3] = AD_VAL_ARG(3,50);
	    
 	    IA =(float)num[3]*(5.0/1024) -0.02; 
		
	    IA1 = ((IA - 2.51)/0.022)/3.0 +1;
	    
	   // numtobits[0] =(uint8_t)(num[0]>>8);
	   // numtobits[1] = (uint8_t)num[0];
	   // R_UART0_Send(numtobits, 2);
	    
	    if(IA1>0.5)
	    {
		    if(temp[0]<40&&temp[1]<40&&temp[2]<40)
		    {
			SWTICH_LOW;    
		    }else SWTICH_HIGH; 
	    }else {
	       SWTICH_HIGH; 
	    }
	    
	    
	    
	     
	    //SINGLE_LOW;	    	    
	    delay(100);   
	    //SINGLE_HIGH;
	   // delay(100);
        
    }
    /* End user code. Do not edit comment generated here */
}

通过一个简单的查表法计算温度,空间换时间

uint16_t NTCTAB[151] ={
0x69,0x6E,0x73,0x79,0x7F,0x85,0x8B,0x91,0x98,0x9E,0xA5,0xAC,0xB3,
0xBB,0xC3,0xCA,0xD3,0xDB,0xE3,0xEC,0xF5,0xFE,0x107,0x111,0x11B,
0x125,0x12F,0x139,0x143,0x14E,0x158,0x163,0x16E,0x179,0x184,0x18F,
0x19A,0x1A6,0x1B1,0x1BC,0x1C7,0x1D3,0x1DE,0x1E9,0x1F4,0x200,0x20B,0x216,0x221,
0x22C,0x236,0x241,0x24C,0x256,0x260,0x26B,0x275,0x27F,0x288,0x292,0x29C,
0x2A5,0x2AE,0x2B7,0x2C0,0x2C8,0x2D1,0x2D9,0x2E1,0x2E9,0x2F1,0x2F8,0x300,0x307,
0x30E,0x315,0x31C,0x322,0x328,0x32F,0x335,0x33A,0x340,0x346,0x34B,0x350,0x355,
0x35A,0x35F,0x364,0x368,0x36C,0x371,0x375,0x379,0x37D,0x380,0x384,0x388,0x38B,
0x38E,0x392,0x395,0x398,0x39B,0x39D,0x3A0,0x3A3,0x3A5,0x3A8,0x3AA,0x3AD,0x3AF,
0x3B1,0x3B3,0x3B5,0x3B7,0x3B9,0x3BB,0x3BD,0x3BF,0x3C0,0x3C2,0x3C4,0x3C5,0x3C7,
0x3C8,0x3CA,0x3CB,0x3CD,0x3CE,0x3CF,0x3D1,0x3D2,0x3D3,0x3D4,0x3D5,0x3D6,0x3D8,
0x3D9,0x3DA,0x3DB,0x3DC,0x3DD,0x3DE,0x3DE,0x3DF,0x3E0,0x3E1,0x3E2,0x3E2
};
//二分查表函数
uint8_t look_up_table(uint16_t *a,uint16_t ArrayLong,uint16_t data)
{    
    uint16_t begin,end,middle ;  
    uint8_t i ;  
    begin = 0 ;  
    end = ArrayLong-1 ;  
    i = 0  ;  
    if(data >= a[end]) return end ;  
    else if(data <= a[begin]) return begin ;  
    while(begin < end)  
    {  
            middle = (begin+end)/2 ;  
            if(data == a[middle] ) break ;  
            if(data < a[middle] && data > a[middle-1]) break ;   
            if(data < a[middle])  end = middle ;                      
            else begin = middle ;      
            if(i++ > ArrayLong) break ;  
    }  
    if(begin > end ) return 0 ;   
    return middle ;
		
}
//输入表的序号值,得到温度值

float num_to_temperature(uint16_t data)
{
    uint8_t num = look_up_table(NTCTAB,151,data);
    float  data1;
    float  temp;	 
    data1 = 1*num-20;
			//线性取值 扩大一百倍提高精度
	temp = ((float)((data-NTCTAB[num-1])*100/(NTCTAB[num]-NTCTAB[num-1])));
	data1 = ((float)data1*100 - temp)/100;
    return data1;
}

有些人可能不知道这个表怎么算,百度一下很多的。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
很抱歉,作为AI语言模型,我无法编写代码。但是,我可以提供一些ADC采集的基础知识和步骤,以帮助您编写代码。 基础知识: ADC(模数转换器)是一种将模拟信号转换为数字信号的器件。在微控制器中,ADC通常用于将传感器测量值转换为数字信号,以便微控制器可以进行数字处理。微控制器通常具有内置的ADC模块,可以通过编程进行配置和使用。 步骤: 1. 配置ADC模块:根据您的需求,选择ADC模块的工作模式、采样速率、采样精度等参数,并将这些参数写入ADC模块的寄存器中。 2. 配置引脚:将需要采集的信号连接到ADC模块的输入引脚上,并配置引脚为ADC输入模式。 3. 启动ADC转换:通过编程向ADC模块发送启动转换的指令,ADC模块开始进行采样和转换。 4. 获取采样结果:当ADC转换完成后,将采样结果从ADC寄存器中读取出来,并进行后续处理。 下面是一个简单的ADC采集代码示例,您可以根据自己的需求进行修改和完善: ```c #include "iodefine.h" //包含了瑞萨RX24T的寄存器定义 void adc_init() { /* 配置ADC模块 */ /* 选择单次转换模式 */ AD.ADCSR.BIT.ADCS = 0; /* 选择10位精度 */ AD.ADCSR.BIT.ADF = 0; /* 选择外部参考电压 */ AD.ADCSR.BIT.ADIE = 0; /* 选择采样时间 */ AD.ADSSTR0.BIT.SST0 = 0x0F; //最大采样时间 /* 选择采样时钟 */ AD.ADCSR.BIT.CKS = 0x03; //PCLK/8 /* 选择参考电压 */ AD.ADCSR.BIT.ADREF = 0; //使用内部参考电压 /* 允许ADC模块工作 */ AD.ADCSR.BIT.ADST = 0; } int adc_read(int ch) { /* 配置ADC输入引脚 */ switch (ch) { case 0: MPC.P40PFS.BIT.ASEL = 1; //配置P40为ADC输入 break; case 1: MPC.P41PFS.BIT.ASEL = 1; //配置P41为ADC输入 break; case 2: MPC.P42PFS.BIT.ASEL = 1; //配置P42为ADC输入 break; default: return 0; } /* 启动ADC转换 */ AD.ADCSR.BIT.ADST = 1; while (AD.ADCSR.BIT.ADST == 1); //等待转换完成 /* 获取采样结果 */ return AD.ADDRA(ch); //返回ADC寄存器中的采样值 } int main() { adc_init(); //初始化ADC模块 int result = adc_read(0); //采集P40引脚的信号 return 0; } ``` 该代码使用瑞萨RX24T的ADC模块来采集P40、P41、P42三个引脚的信号,并返回采样结果。您可以根据需要修改ADC模块的配置参数和采集引脚
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值