STM32 ADC

1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)

           STM32F103系列:在56MHz时转换时间为:1μs

                                    在72MHz时转换时间为:1.17μs

      2、转换范围:0~3.6V  (3.6v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.6))

      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)

      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)

      5、双重模式(带2个ADC的设备): 8种转换模式

      6、最多有18个通道:16个外部通道

                                   2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)

      ......(略,请看参考手册哈,由于篇幅,就不过多的列出来了、、说到略、让我想起了月光宝盒诸葛亮的:略懂略懂、、其实我也是略懂略懂而已、、)

      12、DMA功能(仅ADC1有)

      本博客里,由于篇幅、所以就以独立模式下的单次转换为例哈、打开参考手册可以看到这段话:

       单次转换模式下,ADC只执行一次转换。

       该模式既可通过设置ADC_CR2寄存器的ADON位(只适用于规则通道)启动也可通过外部触发启动(适用于规则通道或注入通道),这时CONT位为0。

       一旦选择通道的转换完成:

       ● 如果一个规则通道被转换: ─ 转换数据被储存在16位ADC_DR寄存器中 ─ EOC(转换结束)标志被设置 ─ 如果设置了EOCIE,则产生中断。

       ● 如果一个注入通道被转换: ─ 转换数据被储存在16位的ADC_DRJ1寄存器中 ─ JEOC(注入转换结束)标志被设置 ─ 如果设置了JEOCIE位,则产生中断。

       然后ADC停止。

      此图形象的表明了其背后那不为人知的秘密转换关系。。虽然单凭看文字就能想象出来、但是、有图片是不是更加形象呢???

 

     对于以上的寄存器、在此我稍微提提:免得寄存器大神们产生怨气:好不容易等到你讲我老大ADC,却不把我这些背后的勤劳者给导出来

范例:

 

vu16 ADC_DMA_IN[2]; //ADC数值存放的变量

 

void ADC_DMA_Init(void){ //DMA初始化设置

DMA_InitTypeDef DMA_InitStructure;//定义DMA初始化结构体

DMA_DeInit(DMA1_Channel1);//复位DMA通道1

DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; //定义 DMA通道外设基地址=ADC1_DR_Address

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_DMA_IN; //!!!定义DMA通道ADC数据存储器(其他函数可直接读此变量即是ADC值)

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//指定外设为源地址

DMA_InitStructure.DMA_BufferSize = 2;//!!!定义DMA缓冲区大小(根据ADC采集通道数量修改)

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//当前外设寄存器地址不变

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//!!! 当前存储器地址:Disable不变,Enable递增(用于多通道采集)

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//定义外设数据宽度16位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //定义存储器数据宽度16位

DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA通道操作模式位环形缓冲模式

DMA_InitStructure.DMA_Priority = DMA_Priority_High;//DMA通道优先级高

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//禁止DMA通道存储器到存储器传输

DMA_Init(DMA1_Channel1, &DMA_InitStructure);//初始化DMA通道1

DMA_Cmd(DMA1_Channel1, ENABLE); //使能DMA通道1

}

void ADC_GPIO_Init(void){ //GPIO初始化设置

GPIO_InitTypeDef  GPIO_InitStructure; 

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);       

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);//使能DMA时钟(用于ADC的数据传送)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//使能ADC1时钟

    GPIO_InitStructure.GPIO_Pin = ADC_CH4 | ADC_CH5; //!!!选择端口                        

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //选择IO接口工作方式       

GPIO_Init(ADCPORT, &GPIO_InitStructure);

}

void ADC_Configuration(void){ //初始化设置

ADC_InitTypeDef ADC_InitStructure;//定义ADC初始化结构体变量

ADC_GPIO_Init();//GPIO初始化设置

ADC_DMA_Init();//DMA初始化设置

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//ADC1和ADC2工作在独立模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE; //使能扫描

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ADC转换工作在连续模式

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//转换数据右对齐

ADC_InitStructure.ADC_NbrOfChannel = 2;//!!!顺序进行规则转换的ADC通道的数目(根据ADC采集通道数量修改)

ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器

//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间

//ADC1,ADC通道x,规则采样顺序值为y,采样时间为28周期  

ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_28Cycles5);//!!! ADC1选择信道x,采样顺序y,采样时间n个周期

ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_28Cycles5);//!!! ADC1选择信道x,采样顺序y,采样时间n个周期

 

ADC_DMACmd(ADC1, ENABLE);// 开启ADC的DMA支持(要实现DMA功能,还需独立配置DMA通道等参数)

ADC_Cmd(ADC1, ENABLE);//使能ADC1

ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器

while(ADC_GetResetCalibrationStatus(ADC1));//等待ADC1校准重置完成

ADC_StartCalibration(ADC1);//开始ADC1校准

while(ADC_GetCalibrationStatus(ADC1));//等待ADC1校准完成

ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件开始转换

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值