2604|5

58

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

AT32F421测评 [复制链接]

 

        ADC作为片上必备外设有着超高的使用率.虽然一般是10位,12位但在不太严格的场合足够使用.

雅特力也不例外,其片上内嵌1个12位的ADC ,有15个外部通道和3个内部通道(温度传感器、 内部参考电压、和VSSA) ,可以实现单次或扫描转换。支持DMA,模拟看门狗和触发转换.其时钟最高可到28MHz,仅需0.5微秒.

       在at32_board.c中增加ADC的初始化代码.

/*
*		ADC初始化
*		通道3
*   PA3
*/
void ADCX_Init(void)
{
	RCC_ADCCLKConfig(RCC_APB2CLK_Div6);		//ADC时钟6分频
	RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_ADC1 , ENABLE);
	
	RCC_AHBPeriphClockCmd(RCC_AHBPERIPH_GPIOA , ENABLE);

	GPIO_InitType           GPIO_InitStructure;
	ADC_InitType            ADC_InitStructure;
	
	  /* GPIO配置*/
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Pins = GPIO_Pins_3 ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	
		/* ADC1 配置 */
	ADC_StructInit(&ADC_InitStructure);
	ADC_InitStructure.ADC_Mode              = ADC_Mode_Independent;
	ADC_InitStructure.ADC_ScanMode          = DISABLE;
	ADC_InitStructure.ADC_ContinuousMode    = DISABLE;
	ADC_InitStructure.ADC_ExternalTrig      = ADC_ExternalTrig_None;
	ADC_InitStructure.ADC_DataAlign         = ADC_DataAlign_Right;
	ADC_InitStructure.ADC_NumOfChannel      = 1;
	ADC_Init(ADC1, &ADC_InitStructure);
	/* ADC采样通道和采样时间 */ 
	ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 1, ADC_SampleTime_71_5); 
    //转换完成中断	
	ADC_INTConfig(ADC1, ADC_INT_EC, ENABLE);

		/* 使能 ADC1 */
	ADC_Ctrl(ADC1, ENABLE);
	
    /* 校准ADC */
	ADC_RstCalibration(ADC1);
	while(ADC_GetResetCalibrationStatus(ADC1));
	ADC_StartCalibration(ADC1);
	while(ADC_GetCalibrationStatus(ADC1));

	/* 启动ADC转换 */ 
	ADC_SoftwareStartConvCtrl(ADC1, ENABLE);

}

at32_board.h中声明一下void ADCX_Init(void);然后添加到

void rt_hw_board_init()
{
    /* System Clock Update */
    SystemCoreClockUpdate();
    
    /* System Tick Configuration */
    _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
	
	  /* 串口1初始化*/
		UART_Print_Init(115200);
      //ADC初始化
	  ADCX_Init();
	 
    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
     rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

        在main中初始化线程控制块,及线程入口函数.

 /*
 *************************************************************************
 * 变量
 *************************************************************************
 */
 //ADC转换值
 uint16_t ADC_value;

 /* 定义线程栈4字节对齐 */
 ALIGN(RT_ALIGN_SIZE)
 /* 定义线程控制块 */
 static struct rt_thread ADC_thread;

 /* 定义线程栈大小 */
 static rt_uint8_t ADC_stack[192];
 /*
 *************************************************************************
 * 函数声明
 *************************************************************************
 */
 static void ADC_thread_entry(void *parameter);


/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] Main program
  * @param  None
  * @retval None
  */
int main(void)
{     
	rt_err_t result;
    /* 初始化ADC线程控制块 */
    result = rt_thread_init(&ADC_thread,
                            "ADC",
                            ADC_thread_entry,
                            RT_NULL,
                            (rt_uint8_t *)&ADC_stack[0],
                            sizeof(ADC_stack),
                            5,
                            5);
    if (result == RT_EOK)
    {
        rt_thread_startup(&ADC_thread);
    }
    return 0;
}


static void ADC_thread_entry(void *parameter)
{
    while (1)
    {
         if(ADC_GetINTStatus(ADC1, ADC_INT_EC) != RESET){
				 ADC_value=ADC_GetConversionValue(ADC1);
	       rt_kprintf("ADC_value: %d \r\n",ADC_value);
         }
	       rt_thread_mdelay(500);
				 /* 启动ADC转换 */ 
	       ADC_SoftwareStartConvCtrl(ADC1, ENABLE);
    }
}


       由于rt_kprintf不支持输出浮点数这里就直接输出转换后的值了.

       在配置线程栈大小时候可以先大致给一个,然后在控制台中用ps命令查看一下栈使用率,一般维持在七十多比较好.为了方便截图这里暂时断开连接了.

旋转电位器可以看到转换值的变化

硬件连接

 

 

最新回复

看起来指标还行,你这表确实没听说过。。。   详情 回复 发表于 2021-5-16 21:33
点赞 关注
 
 

回复
举报

6828

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

10位的ADC平时足够用了

是的,这个rt_kprintf不支持输出浮点数

期待下来的楼主测评

 
 
 

回复

2万

帖子

71

TA的资源

管理员

板凳
 

针对一个外设的评测挺好的,期待后续。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

4
 

谢谢分享,如果有标准AD值和采样之间的精度对比就好了

点评

  首先说明一下我用的表是手持三位半的国产垃圾表,这种小电压精度还是差点意思的,第一张图是600mv档,第二张图是6v档.其次ADC外部我没加RC所以adc采到的精度也有误差具体多少就不知道了,反正家里是没条件折腾  详情 回复 发表于 2021-5-16 13:08
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

5
 
freebsder 发表于 2021-5-12 09:49 谢谢分享,如果有标准AD值和采样之间的精度对比就好了

 

首先说明一下我用的表是手持三位半的国产垃圾表,这种小电压精度还是差点意思的,第一张图是600mv档,第二张图是6v档.其次ADC外部我没加RC所以adc采到的精度也有误差具体多少就不知道了,反正家里是没条件折腾.

万用表是每秒采集只有几次所以ADC我是采集4次算的平均值.大概600毫秒多一点更新一次.仅供参考.

 

 

 
 
 

回复

7671

帖子

2

TA的资源

五彩晶圆(高级)

6
 

看起来指标还行,你这表确实没听说过。。。

个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表