板子: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设置的一样吗?
读取的电压数据要保留四位该怎么操作?
谢谢