rtthread,hal,adc电压读取求平均值,用线程

板子:stm32f103zet6

1.用cubemx配置底层

2.按照board.h配置

3.写代码。

#include <rtthread.h>
#include <rtdbg.h>
#include <board.h>
#include <rtdevice.h>

//定义线程
rt_thread_t tid1;


#define ADC1_DEV_NAME           "adc1"           /* ADC 设备名称 */
#define ADC1_DEV_CHANNEL        11               /* ADC 通道 *//* PC1*/
#define REFER_VOLTAGE           330              /* 参考电压 3.3V,数据精度乘以100保留2位小数*/
#define CONVERT_BITS            (1 << 12)        /* 转换位数为12位 */
#define ADCCT                   10               /*ADC 计数次数 */
#define ADC1_PRIORITY           16

void adc1_entry(void *parameter)
{
    rt_adc_device_t adc_dev;//句柄
    rt_uint32_t value,vol;
    rt_err_t ret = RT_EOK;
    rt_uint32_t sumvalue;//求和
    rt_uint32_t avgvalue;//求平均数

    /*设备端操作 */
    /* 查找设备 */
    adc_dev = (rt_adc_device_t)rt_device_find(ADC1_DEV_NAME);
      if (adc_dev == RT_NULL)
      {
          rt_kprintf("adc sample run failed! can't find %s device!\n", ADC1_DEV_CHANNEL);

      }

      /* 使能设备 */
      ret = rt_adc_enable(adc_dev, ADC1_DEV_CHANNEL);

      /*ADC 采样 */
 while(1){
             /*ADC 值每次进入循环清零 */
             sumvalue = 0;
             avgvalue = 0;
             /* 采样 */
             for(int i =0;i<ADCCT;i++)//循环十次
                 {
                     // rt_kprintf("the value is :%d \n", value);
                     value = rt_adc_read(adc_dev, ADC1_DEV_CHANNEL);
                     rt_thread_mdelay(100);
                     /* 求和 */
                     sumvalue += value;
                 }
             /*计算平均值 */
             avgvalue =(float)sumvalue/ADCCT;//ADCCT是10
             rt_kprintf("pc1 avgvalue is :%d \n", avgvalue);

             /* 转换为对应电压值 */
             vol = avgvalue * REFER_VOLTAGE / CONVERT_BITS;
             rt_kprintf("pc1 avgvol is :%d.%02d \n", vol / 100, vol % 100);
          }
      /* 关闭通道 */
      rt_adc_disable(adc_dev, ADC1_DEV_CHANNEL);
}


int adc_sample(void)
{
    //创建线程
    tid1 = rt_thread_create("adc1",//adc设备名称
                            adc1_entry,//入口函数
                            RT_NULL,
                            512,//采样线程栈大小
                            16,// THREAD_PRIORITY
                            20);//THREAD_TIMESLICE
    //线程启动
    rt_thread_startup(tid1);
    return RT_EOK;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(adc_sample, adc_sample);

4.我的问题:

再读取一个adc通道,新建一个线程,在入口函数里再找一次设备,这么写合适吗?

第二个线程的优先级要和线程1设置的一样吗?

读取的电压数据要保留四位该怎么操作?

谢谢

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值