2910|2

7095

帖子

11

TA的资源

版主

楼主
 

【国民技术N32G457评测】RT_Thread ADC 之电压表 [复制链接]

  本帖最后由 lugl4313820 于 2022-1-29 23:33 编辑

今天用RT_Thread Studio 做一个电压表。工程是基于原来的SSD1306来建立的,这里主要讲一下ADC的工程如何建立,代码的书写。

1、打开RT_Thread Setttings 打开ADC选项:

打开:DS_N32G457系列数据手册V1.2.1.pdf,找到ADC1 通道2 即PA1。

在main.c中添加adc读取线程:

main.c如下:

#include <stdint.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "ssd1306.h"
#include <stdio.h>
/* defined the LED1 pin: PB5 */
#define LED1_PIN    91

#define ADC_DEV_NAME     "adc1"
#define ADC_DEV_CHANNEL  2  //PA1

#define THREAD_PRIORITY         20
#define THREAD_STACK_SIZE       1025
#define THREAD_TIMESLICE        10

static rt_thread_t tid_ssd1306_display = RT_NULL;
void adc_temp_sample(void *parameter)
{
    rt_adc_device_t adc_temp_dev;
    rt_uint32_t value, vol;
    double temperate;
    rt_err_t ret = RT_EOK;
    char v[6] = {'0','.','0','0','0','V'};

    adc_temp_dev = (rt_adc_device_t)rt_device_find(ADC_DEV_NAME);
    if(adc_temp_dev == RT_NULL)
    {
        rt_kprintf("adc_temp run failed ! can't find %s device!\n",ADC_DEV_NAME);
        //return RT_ERROR;
    }
    /*使能设备 */

    ret = rt_adc_enable(adc_temp_dev, ADC_DEV_CHANNEL);

    if(ret == RT_EOK)
        {
            rt_kprintf("adc sample run success!  find %s device!\n", ADC_DEV_NAME);
        }
        while(1)
        {
            /* 读取采样值 */
            value = rt_adc_read(adc_temp_dev, ADC_DEV_CHANNEL);

            /* 转换为对应温度值 */
            temperate = value *(3.30 / 4096.0)*1000;
            vol = (rt_uint32_t)temperate;
            ssd1306_Fill(Black);
            ssd1306_SetCursor(2, 26);
            v[0] = vol/1000 + '0';
            v[2] = vol/100%10 +'0';
            v[3] = vol/10%10 +'0';
            v[4] = vol%10 +'0';
            ssd1306_WriteString(v, Font_16x26, White);
            ssd1306_UpdateScreen();
            rt_kprintf("the value is :%s \n\r", v);
            rt_thread_mdelay(100);
        }
}


int main(void)
{
    uint32_t Speed = 200;
    /* set LED1 pin mode to output */
    rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
    ssd1306_Init();
    rt_kprintf("start ssd1306\r\n");

    ssd1306_Fill(White);
    ssd1306_UpdateScreen();
    ssd1306_Fill(Black);
    ssd1306_UpdateScreen();
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2,16);
    ssd1306_WriteString("START", Font_16x26, White);
    ssd1306_UpdateScreen();
    tid_ssd1306_display = rt_thread_create("th_ssd",
                                 adc_temp_sample, RT_NULL,
                                     THREAD_STACK_SIZE,
                                     THREAD_PRIORITY, THREAD_TIMESLICE);

             /* 如果获得线程控制块,启动这个线程 */
     if (tid_ssd1306_display != RT_NULL)
         rt_thread_startup(tid_ssd1306_display);
    while (1)
    {
        rt_pin_write(LED1_PIN, PIN_LOW);
        rt_thread_mdelay(Speed);
        rt_pin_write(LED1_PIN, PIN_HIGH);
        rt_thread_mdelay(Speed);
    }
}

总的来说用RT—Thread Studio 生成ADC取值,还是很简单的。从视频的检测结果来看,与FLUK 18B+的相比,高了大约0.05V左右 (后面我量了一下参考电压只有3.24V左右,可能是这个原因造成的吧),当然也没有做平均,是单次采样的显示。结果还是令人满意的。

      今天本来是想先用ADC来测量片内的温度(ADC1 16通道),但是测出来的值是零,没有跑成功。用官方提供的KEIL的例程是可以测出来的。还没有找到具体原因,翻了一下STM32的资料,是讲要较对一下,看了rt_thread的n32g45x.adc,drv_adc.c,adc.c也没找到解决方法。如果官方技术上班,还请技术指导一下。

附上视频:


 

 

最新回复

顶一下,整的不错 [attach]586539[/attach]     详情 回复 发表于 2022-1-30 08:32
点赞(1) 关注
 
 

回复
举报

6855

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

顶一下,整的不错

 

点评

谢谢支持!还需要继续努力呀!生命不息,学习不断!  详情 回复 发表于 2022-1-30 10:01
 
 
 

回复

7095

帖子

11

TA的资源

版主

板凳
 
Jacktang 发表于 2022-1-30 08:32 顶一下,整的不错  

谢谢支持!还需要继续努力呀!生命不息,学习不断!

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表