ADC过采样代码例子,拿来就用。

#include <QCoreApplication>
#include <string.h>
#include <QTime>
 
//此处进行一次采样
unsigned int mydata()
{
    unsigned int data=0;
    data=qrand()%65535;
    return data;
}
 
 
//过采样公式 (4^n)采样次数合  进行(2^n)右移位   n为增加的位数
unsigned int oversampling(unsigned char Places,unsigned int (*p)(void))
{
    unsigned int Sampling_frequency=4;
    unsigned int shift=2;
    unsigned int i=0;
    unsigned int sum=0;//这个合其实应该是浮点型的
 
 
    //计算需要采样的次数
    for(i=0;i<Places-1;i++)
    {
        Sampling_frequency=4*Sampling_frequency;
    }
    //计算移位数
    for(i=0;i<Places-1;i++)
    {
        shift=2*shift;//这里其实不应该使用移位做除法,但是除数的计算差不多,不过是增加一位ADC就要除2^n次方

//比如增加一位精度是除2^1=2 增加两就是2^2=4

}

    //采样
    for(i=0;i<Sampling_frequency;i++)
    {
        sum+=p();
    }
    sum=(float)sum*1.0/(float)shift;//在这里下一步应该补充一个四舍五入,然后返回结果即可
    return (unsigned int)sum;
}
 
 
 
 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));
 
    printf("%ld\n",oversampling(8,mydata));
 
    return a.exec();
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ADC采样的代码与具体的硬件设备和开发平台有关,下面是一个基于STM32F103C8T6微控制器的ADC采样的示例代码,仅供参考: ```c #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "stm32f10x_rcc.h" #include "stm32f10x_gpio.h" int main(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE); // 使能ADC1和GPIOA时钟 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PA0连接到ADC1通道0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 设置为模拟输入 GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 单通道模式 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; // 单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; // 采样通道数为1 ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); // 配置ADC1通道0为采样通道 ADC_Cmd(ADC1, ENABLE); // 使能ADC1 ADC_ResetCalibration(ADC1); // 复位ADC1校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1)); // 等待校准寄存器复位完成 ADC_StartCalibration(ADC1); // 开始ADC1校准 while(ADC_GetCalibrationStatus(ADC1)); // 等待校准完成 while(1) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始ADC1转换 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成 uint16_t adc_value = ADC_GetConversionValue(ADC1); // 读取转换结果 // 处理采样结果 } } ``` 这段代码使用了PA0作为采样通道,采样过程中不使用外部触发,每次采样的时间为239.5个时钟周期。在无限循环中,不断进行ADC采样,并读取采样结果进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值