蓝桥杯嵌入式RTC、ADC

一、RTC

1、配置RTC(实时时钟)

2、获取实时时钟

/* 两个存放时间的结构体 */
RTC_DateTypeDef Y_M_D_Date;
RTC_TimeTypeDef H_M_S_Time;
/* 获取时间的函数(以二进制数据) */
if(HAL_RTC_GetDate(&hrtc,&Y_M_D_Date,RTC_FORMAT_BIN)){}
if(HAL_RTC_GetTime(&hrtc,&H_M_S_Time,RTC_FORMAT_BIN)){}

HAL_RTC_GetDate、HAL_RTC_GetTime 函数返回HAL_OK

RTC_TimeTypeDef、RTC_DateTypeDef  系统定义

二、ADC

1、ADC采集模块的硬件设计

G431拥有2 ADC 转换器, ADC1 14 的外部通道 +4 个内部通道, ADC2 16 个外部通道 +2 个内部通
道,转换精度 12
ADC1 的通道 11 通过 PB12 与电位器 R38 相连,检测范围 0~3.3V
ADC2 的通道 15 通过 PB15 与电位器 R37 相连,检测范围 0~3.3V

2、配置

IN15/IN11为single-ended:选择通道

ContinuousConvMode = ENABLE;

保证持续输出

DMAContinuousRequests = ENABLE;
ADC 转换是一件比较耗时的任务,实际开发中还是使用 DMA 方式比较好

DMA设置circular,传输设为word

DMA中断和ADC中断;勾选ADC中断,同等优先级

3、数模转换代码

ADC工作原理:逐次逼近法,目的是计算待测模拟电压的数字编码。

G431的ADC存在12位的输入通道,可以得出ADC的分辨率为12位,可以量化的范围为0~4095。

通过HAL_ADC_GetValue()得到待测电压的编码电压,如果用其/4095*3.3则等于原来的待测电压

(1)、普通获取

float get_adc2 ( void )
{
        uint32_t temp = 0 ;
        //采样 10
             for ( uint8_t i = 0 ; i < 10 ; i ++ )
        {
                HAL_ADC_Start ( & hadc2 );
                if ( HAL_ADC_PollForConversion ( & hadc2 , 100 ) == HAL_OK ){
                        temp += HAL_ADC_GetValue ( & hadc2 );
                }
        }
        temp = temp / 10 ; // 取平均值
        return temp * 3.3 / 4095 ;
}

(2)、DMA直接获取

uint32_t ADC1_value[30];//存放编码电压值

主函数中

HAL_ADC_Start_DMA(&hadc1,(uint32_t *)&ADC1_value,30);//开启ADC中断  

主循环中调用 

//ADC转换函数
void get_adc1(void)
{
	uint32_t temp=0;
	//采样30次
	for(uint8_t i=0;i<30;i++)
	{
			temp += ADC1_value[i];
	}
		sprintf((char *)text,"   adc1= %1.4f ",
			(double)temp/30*3.3/4096);//取平均值,转为模拟电压
		LCD_DisplayStringLine(Line2, (uint8_t *)text);	
	
}

  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值