研究生
最后登录1970-1-1
在线时间 小时
注册时间2016-7-21
|
楼主 |
发表于 2016-10-24 21:12:29
|
显示全部楼层
电压测量:
1、电压测量使用ADC
2、ADC12表示ADC1和ADC2共用通道
3、ADC时钟最高不能超过14MHz
- #include "stm32f10x.h"
- #include "uart.h"
- void ADC_GPIO_Config(void);
- uint16_t GetADC(void);
- float VoltageConvert(void);
- int main(void)
- {
- // 程序来到main函数之前,启动文件:statup_stm32f10x_hd.s已经调用
- //SystemInit();//函数把系统时钟初始化成72MHZ
- // SystemInit()在system_stm32f10x.c中定义
- // 如果用户想修改系统时钟,可自行编写程序修改
- uint16_t i,j;
- int temp = 0;
- float v;
- ADC_GPIO_Config();
- UART1_Config(115200);
-
- while( 1 )
- {
- v = VoltageConvert();
- printf("电压: %f\n", v);
- for(i = 0; i < 65535; i++)
- for(j = 0; j < 564; j++);
- }
- }
- /*ADC的输入时钟不得超过14MHz*/
- void ADC_GPIO_Config(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
-
- //开启IO口时钟和ADC时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
-
- //ADC使用悬浮输入
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
- GPIO_Init(GPIOC, &GPIO_InitStructure);
-
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不受外界影响
- ADC_InitStructure.ADC_NbrOfChannel = 1;//只有一个通道
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描模式关闭
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//连续模式关闭
- ADC_Init(ADC1, &ADC_InitStructure);//配置到ADC1
- //ADC时钟8分频,9MHz,最高不能超过14MHz
- RCC_ADCCLKConfig(RCC_PCLK2_Div8);
-
- ADC_Cmd(ADC1, ENABLE);//使能ADC1
- ADC_ResetCalibration(ADC1);//复位校准
- while(ADC_GetResetCalibrationStatus(ADC1) == SET);//0初始化完成 / 1初始化开始
- ADC_StartCalibration(ADC1);//开始校准
- while(ADC_GetCalibrationStatus(ADC1) == SET);//0校准完成 / 1校准开始
- }
- uint16_t GetADC(void)
- {
- ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);//PC1为通道11,配置到ADC1中,1个通道
- ADC_SoftwareStartConvCmd(ADC1, ENABLE);
- while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) != SET);//等待转换结束
- return ADC_GetConversionValue(ADC1);
- }
- float VoltageConvert(void)
- {
- float voltage;
- //12位ADC, 2^12=4096, 3.3V量程分成4096份,2^n-1才能达到最大值
- voltage = GetADC() * 3.3 * 7.738 / 4095;//理论值7.67倍
- return voltage;
- }
复制代码
|
|