|
本文分享adc的测试。 代码如下 Adc初始化
- void adc_init(void)
- {
- /* ADC Init */
- ADC_DeInit(ADC1);
- RCC_Peripheral_ClockEn(ADCCLC);
- //ADC校准
- ADC_Cmd(ADC1,ENABLE);//使能ADC
- cf_delay_us(1);
- ADC_ResetCalibration(ADC1);
- while(RESET != ADC_GetResetCalibrationStatus(ADC1));
- cfprintf("adinit1,%08Xn",ADC1->CR2);
- ADC_StartCalibration(ADC1);
- while(RESET != ADC_GetCalibrationStatus(ADC1));
- ADC_Cmd(ADC1,DISABLE);//使能ADC
- RCC_Peripheral_ClockEn(GPIOACLC);
- GPIO_Set_Direction(GPIOA, 0, GPIO_DIRECT_INPUT);
- GPIO_Set_Config(GPIOA, 0, GPIO_CONF_INPUT_ANALOG);
- ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5);
- ADC_InitTypeDef ADC_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_ContinuousConvMode = DISABLE;
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- ADC_InitStructure.ADC_NbrOfChannel = 1;
- ADC_Init(ADC1, &ADC_InitStructure);
- ADC_Cmd(ADC1, ENABLE);
- //使能温度传感器
- CSFC_Set_Temperature(CSFC_ENABLE);
- ADC_TempSensorVrefintCmd(ENABLE);
- }
复制代码
获取ADC值
- uint16_t AD_GetValue(uint8_t ADC_Channel)
- {
- ADC_Cmd(ADC1, ENABLE);
- ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5); // ADC1通道ADC_Channel,序列1,采样时间
- ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 软件触发ADC转换开始
- while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == (FlagStatus)RESET);// 判断规则组转换完成标志位
- uint16_t ad = ADC_GetConversionValue(ADC1);// 读出来,自动清除EOC标志位
- ADC_Cmd(ADC1, DISABLE);//除非需求降低功耗,否则不建议频繁开关ADC模组
- return ad;
- }
复制代码
获取温度值
- int Get_Temperature(void)
- {
- uint16_t ad = AD_GetValue(ADC_Channel_10);
- xprintf("temp ad:%drn",ad);
- return (((int32_t)1450 - (int32_t)3300 *(int32_t)ad/(int32_t)4095)*(int32_t)100/(int32_t)440 + 25);
- }
复制代码
测试代码main.c
- #include
- #include "main.h"
- #include "demo.h"
- #include "uart.h"
- #include "shell.h"
- #include "shell_func.h"
- #include "xprintf.h"
- #include "adc_demo.h"
- static void xprintf_out(int ch){
- uint8_t c=(uint8_t)ch;
- uart_send(1, &c, 1);
- }
- static uint32_t shell_read(uint8_t *buff, uint32_t len)
- {
- return uart_read(1,buff,len);
- }
- static void shell_write(uint8_t *buff, uint32_t len)
- {
- uart_send(1,buff,len);
- }
- void Global_Interrupt_En(uint32_t s)
- {
- if(s & 0x00000008ul)
- set_csr(mstatus, 0x00000008ul);
- }
- uint32_t Global_Interrupt_Dis(void)
- {
- uint32_t s = read_csr(mstatus);
- clear_csr(mstatus, 0x00000008ul);
- return s;
- }
- void main(void)
- {
- uart_init(0,115200);
- Global_Interrupt_En(0x00000008ul);
- xdev_out(xprintf_out);
- xprintf("HelloWorldrn");
- adc_init();
- while (1)
- {
- shell_set_itf(shell_read, shell_write, (shell_cmd_cfg*)g_shell_cmd_list_ast, 1);
- while(1){
- shell_exec();
- xprintf("adc:%drn",AD_GetValue(ADC_Channel_0));
- xprintf("temp:%drn",Get_Temperature());
- cf_delay_ms(1000);
- }
- }
- }
复制代码
测试使用PA0对应通道0
打印如下
问题 温度测量数值一直变化不准, pa0上接gnd和3v3,打印adc值不变。
|