[MM32硬件] 【灵动微电子MM32F0121测评】3、RTC+ADC

[复制链接]
 楼主| 穿西装的强子 发表于 2025-6-13 22:54 | 显示全部楼层 |阅读模式
1、RTC验证
这个验证比较简单,使用RTC例程进行测试即可
打开MM32的例程,关于RTC的,使用RTC_Calendar工程进行编译
17656684c37e174a8b.png
编译完下载即可,在下载前需要配置下载芯片的算法,例程的工程很多都不带这块,不知道怎么回事
48747684c381f9ab2a.png
看打印的数据
37990684c3839e916c.png
确实是在实时打印RTC的数据,但是有个疑问,我都没配置时间,它怎么知道今天是几月几日星期几几点几分的?
这个地方值得深思,大家也可以测试一下,看是否是同样的效果。
2、ADC电位计验证
同样的打开例程库,使用ADC里面的ADC_AnyChannel_ContinuousScan_Interrupt文件工程进行测试
15747684c39351bc4e.png
通过原理图可以知道,电位器使用的是ADC1_IN3,PA3的接口,因此我们只需要得到PA3的ADC值计算出电压即可
71899684c395dd6c5a.png
配置
  1. ADC_InitTypeDef  ADC_InitStruct;
  2.     GPIO_InitTypeDef GPIO_InitStruct;
  3.     NVIC_InitTypeDef NVIC_InitStruct;

  4.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC, ENABLE);

  5.     ADC_StructInit(&ADC_InitStruct);
  6.     ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  7.     ADC_InitStruct.ADC_Prescaler  = ADC_Prescaler_16;
  8.     ADC_InitStruct.ADC_Mode       = ADC_Mode_Continue;
  9.     ADC_InitStruct.ADC_DataAlign  = ADC_DataAlign_Right;
  10.     ADC_Init(ADC1, &ADC_InitStruct);

  11.     ADC_SampleTimeConfig(ADC1, ADC_Channel_3, ADC_SampleTime_240_5);

  12.     ADC_AnyChannelNumCfg(ADC1, 0);
  13.     ADC_AnyChannelSelect(ADC1, ADC_AnyChannel_0, ADC_Channel_3);
  14.     ADC_AnyChannelCmd(ADC1, ENABLE);

  15.     ADC_ClearFlag(ADC1, ADC_FLAG_EOC);
  16.     ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);

  17.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);

  18.     /* PA3(POT) */
  19.     GPIO_StructInit(&GPIO_InitStruct);
  20.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_3;
  21.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;
  22.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AIN;
  23.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  24.     NVIC_InitStruct.NVIC_IRQChannel = ADC_COMP_IRQn;
  25.     NVIC_InitStruct.NVIC_IRQChannelPriority = 0x00;
  26.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  27.     NVIC_Init(&NVIC_InitStruct);

  28.     ADC_Cmd(ADC1, ENABLE);
在这里配置了一个中断,主要是等待ADC转换完成之后的中断信号,可以通过中断函数判断出来
  1. <blockquote>void ADC_COMP_IRQHandler(void)

ADC转换函数,初始化之后使能了ADC转换功能,主循环等待ADC的中断标准,也就是在等待中断完成ADC转换,然后将ADC值转换成电压3.3V值即可,打印出来
  1. void ADC_AnyChannel_ContinuousScan_Interrupt_Sample(void)
  2. {
  3.     float Voltage;

  4.     printf("\r\nTest %s", __FUNCTION__);

  5.     ADC_Configure();

  6.     ADC_SoftwareStartConvCmd(ADC1, ENABLE);

  7.     while (1)
  8.     {
  9.         if (0 != ADC_InterruptFlag)
  10.         {
  11.             ADC_InterruptFlag = 0;

  12.             Voltage = (float)ADC_GetChannelConvertedValue(ADC1, ADC_Channel_3) * (float)3.3 / (float)4096.0;

  13.             printf("\r\nPOT Voltage = %0.2f", Voltage);
  14.         }
  15.     }
  16. }
观看效果图,测试了0.6V,1.51V,2.25V三个电压,可以看到万用表和ADC测出的有些误差(可能是万用表太差了),实际效果可以达到
71153684c3b6e962df.png 97581684c3b476e706.png 50053684c3b5e16a20.png

3819684c3b1b2c26d.png
11886684c3b2c16eb3.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

259

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部