大学的网站设计重庆装修公司哪家口碑最好
大学的网站设计,重庆装修公司哪家口碑最好,怎么申请网址,网站建设运维自查问题清单ADC工作原理#xff1a;
1、输入通道#xff1a; 2、转换序列#xff1a;
A/D转换被组织为两组#xff1a;规则组#xff08;常规转换组#xff09;和注入组#xff08;注入转换组#xff09;
规则组最多可以有16个转换#xff0c;注入组最多有4个转换 规则组和注入… ADC工作原理
1、输入通道 2、转换序列
A/D转换被组织为两组规则组常规转换组和注入组注入转换组
规则组最多可以有16个转换注入组最多有4个转换 规则组和注入组执行优先级对比 3、触发源
触发转换的方法有两种 1ADON位触发转换(仅限F1系列) 当ADC_CR2寄存器的ADON位为1时再单独给ADON位写1只能启动规则组转换 2外部事件触发转换 外部事件触发转换分为规则组外部触发和注入组外部触发 4、转换时间 5、数据寄存器 6、中断
7、单次转换模式和连续转换模式 8、扫描模式 不同模式组合的作用 单通道ADC采集实验
实验需要用杜邦线把RV1和ADC给连接起来
实验要求:
1功能描述 通过ADC1通道1PA1采集电位器的电压并显示ADC转换的数字量及换算后的电压值
2确定最小刻度 VREF 3.3V à 0V≤VIN≤3.3V 最小刻度 3.3 / 4096 F4/F7/H7系列还需要考虑ADC分辨率 3确定转换时间 采样时间239.5个ADC时钟周期为例可以得到转换时间为21us
4模式组合 单次转换模式、不使用扫描模式
配置步骤
1配置ADC工作参数、ADC校准 HAL_ADC_Init()、HAL_ADCEx_Calibration_Start()
2ADC MSP初始化 HAL_ADC_MspInit() 配置NVIC、CLOCK、GPIO等
3配置ADC相应通道相关参数 HAL_ADC_ConfigChannel()
4启动A/D转换 HAL_ADC_Start()
5等待规则通道转换完成 HAL_ADC_PollForConversion() 6获取规则通道A/D转换结果 HAL_ADC_GetValue()
相关HAL库函数介绍 关键结构体介绍
typedef struct
{
ADC_TypeDef *Instance; /* ADC 寄存器基地址 */ ADC_InitTypeDef Init; /* ADC 参数初始化结构体变量 */ DMA_HandleTypeDef *DMA_Handle; /* DMA 配置结构体 */……
} ADC_HandleTypeDef;typedef struct{ uint32_t DataAlign; /* 设置数据的对齐方式 */ uint32_t ScanConvMode; /* 扫描模式 */ FunctionalState ContinuousConvMode; /* 开启单次转换模式或者连续转换模式 */ uint32_t NbrOfConversion; /* 设置转换通道数目 */ FunctionalState DiscontinuousConvMode; /* 是否使用规则通道组间断模式 */ uint32_t NbrOfDiscConversion; /* 配置间断模式的规则通道个数 */ uint32_t ExternalTrigConv; /* ADC 外部触发源选择 */
} ADC_InitTypeDef;typedef struct
{ uint32_t Channel; /* ADC 转换通道*/ uint32_t Rank; /* ADC 转换顺序 */ uint32_t SamplingTime; /* ADC 采样周期 */
} ADC_ChannelConfTypeDef;原理图 源码
adc.c
#include ./BSP/ADC/adc.hADC_HandleTypeDef g_adc_handle;/* ADC单通道*/
void adc_init(void)
{ADC_ChannelConfTypeDef adc_ch_conf {0};g_adc_handle.Instance ADC1;g_adc_handle.Init.DataAlign ADC_DATAALIGN_RIGHT;g_adc_handle.Init.ScanConvMode ADC_SCAN_DISABLE;g_adc_handle.Init.ContinuousConvMode DISABLE;g_adc_handle.Init.NbrOfConversion 1;g_adc_handle.Init.DiscontinuousConvMode DISABLE;g_adc_handle.Init.NbrOfDiscConversion 0;g_adc_handle.Init.ExternalTrigConv ADC_SOFTWARE_START;//软件触发HAL_ADC_Init(g_adc_handle);HAL_ADCEx_Calibration_Start(g_adc_handle);adc_ch_conf.Channel ADC_CHANNEL_1;adc_ch_conf.Rank ADC_REGULAR_RANK_1;adc_ch_conf.SamplingTime ADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(g_adc_handle, adc_ch_conf);
}
/* ADC MSP初始换函数*/
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
{if(hadc-Instance ADC1){RCC_PeriphCLKInitTypeDef adc_clk_init {0};GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_ADC1_CLK_ENABLE();gpio_init_struct.Pin GPIO_PIN_1;gpio_init_struct.Mode GPIO_MODE_ANALOG; /* 模拟功能 */HAL_GPIO_Init(GPIOA, gpio_init_struct); /* 初始化LED0引脚 */adc_clk_init.PeriphClockSelection RCC_PERIPHCLK_ADC;adc_clk_init.AdcClockSelection RCC_ADCPCLK2_DIV6;HAL_RCCEx_PeriphCLKConfig(adc_clk_init);}
}
/* 获得ADC转换后的结果函数*/
uint32_t adc_get_result(void)
{HAL_ADC_Start(g_adc_handle);HAL_ADC_PollForConversion(g_adc_handle, 10);return (uint16_t)HAL_ADC_GetValue(g_adc_handle);
}
adc.h
#ifndef __ADC_H
#define __ADC_H#include ./SYSTEM/sys/sys.hvoid adc_init(void);
uint32_t adc_get_result(void);#endif
main.c
#include ./SYSTEM/sys/sys.h
#include ./SYSTEM/usart/usart.h
#include ./SYSTEM/delay/delay.h
#include ./BSP/LED/led.h
#include ./BSP/LCD/lcd.h
#include ./BSP/ADC/adc.hint main(void)
{uint16_t adcx;float temp;HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */usart_init(115200); /* 串口初始化为115200 */led_init(); /* 初始化LED */lcd_init(); /* 初始化LCD */adc_init();lcd_show_string(30, 50, 200, 16, 16, STM32, RED);lcd_show_string(30, 70, 200, 16, 16, ADC TEST, RED);lcd_show_string(30, 90, 200, 16, 16, ATOMALIENTEK, RED);lcd_show_string(30, 110, 200, 16, 16, ADC1_CH1_VAL:, BLUE);lcd_show_string(30, 130, 200, 16, 16, ADC1_CH1_VOL:0.000V, BLUE); /* 先在固定位置显示小数点 */while (1){adcx adc_get_result();lcd_show_xnum(134, 110, adcx, 5, 16, 0, BLUE); /* 显示ADCC采样后的原始值 */temp (float)adcx * (3.3 / 4096); /* 获取计算后的带小数的实际电压值比如3.1111 */adcx temp; /* 赋值整数部分给adcx变量因为adcx为u16整形 */lcd_show_xnum(134, 130, adcx, 1, 16, 0, BLUE); /* 显示电压值的整数部分3.1111的话这里就是显示3 */temp - adcx; /* 把已经显示的整数部分去掉留下小数部分比如3.1111-30.1111 */temp * 1000; /* 小数部分乘以1000例如0.1111就转换为111.1相当于保留三位小数。 */lcd_show_xnum(150, 130, temp, 3, 16, 0X80, BLUE);/* 显示小数部分前面转换为了整形显示这里显示的就是111. */LED0_TOGGLE();delay_ms(100);}}单通道ADC采集(DMA读取)实验 实验简要
1功能描述 通过DMA读取数据 通过ADC1通道1PA1采集电位器的电压并显示ADC转换的数字量及换算后的电压值
2确定最小刻度 VREF 3.3V à 0V≤VIN≤3.3V à 最小刻度 3.3 / 4096 F4/F7/H7系列还需要考虑ADC分辨率
3确定转换时间 采样时间239.5个ADC时钟周期为例可以得到转换时间为21us 4模式组合 连续转换模式、不使用扫描模式
配置步骤
1初始化DMA HAL_DMA_Init()
2将DMA和ADC句柄联系起来 __HAL_LINKDMA()
3配置ADC工作参数、ADC校准 HAL_ADC_Init()、HAL_ADCEx_Calibration_Start()
4ADC MSP初始化 HAL_ADC_MspInit() 配置NVIC、CLOCK、GPIO等
5配置ADC相应通道相关参数 HAL_ADC_ConfigChannel()
6使能DMA数据流传输完成中断 HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
7编写DMA数据流中断服务函数 DMAx_Channely_IRQHandler()
8启动DMA开启传输完成中断 HAL_DMA_Start_IT()
9触发ADC转换DMA传输数据 HAL_ADC_Start_DMA
相关库函数介绍 相关结构体介绍
typedef struct
{ uint32_t Direction; /* 传输方向 */ uint32_t PeriphInc; /* 外设非增量模式 */ uint32_t MemInc; /* 存储器非增量模式 */ uint32_t PeriphDataAlignment; /* 外设数据宽度 */ uint32_t MemDataAlignment; /* 存储器数据宽度 */ uint32_t Mode; /* 操作模式 */ uint32_t Priority; /* DMA通道优先级 */
}DMA_InitTypeDef; 源码
adc.c
#include ./BSP/ADC/adc.hDMA_HandleTypeDef g_dma_adc_handle;
ADC_HandleTypeDef g_adc_dma_handle;
uint8_t g_adc_dma_sta;/* ADC DMA读取 初始化函数 */
void adc_dma_init(uint32_t mar)
{ADC_ChannelConfTypeDef adc_ch_conf;__HAL_RCC_DMA1_CLK_ENABLE();g_dma_adc_handle.Instance DMA1_Channel1;g_dma_adc_handle.Init.Direction DMA_PERIPH_TO_MEMORY;g_dma_adc_handle.Init.PeriphInc DMA_PINC_DISABLE;g_dma_adc_handle.Init.MemInc DMA_MINC_ENABLE;g_dma_adc_handle.Init.PeriphDataAlignment DMA_PDATAALIGN_HALFWORD;g_dma_adc_handle.Init.MemDataAlignment DMA_MDATAALIGN_HALFWORD;g_dma_adc_handle.Init.Mode DMA_NORMAL;g_dma_adc_handle.Init.Priority DMA_PRIORITY_MEDIUM;HAL_DMA_Init(g_dma_adc_handle);__HAL_LINKDMA(g_adc_dma_handle, DMA_Handle, g_dma_adc_handle);g_adc_dma_handle.Instance ADC1;g_adc_dma_handle.Init.DataAlign ADC_DATAALIGN_RIGHT;g_adc_dma_handle.Init.ScanConvMode ADC_SCAN_DISABLE;g_adc_dma_handle.Init.ContinuousConvMode ENABLE;g_adc_dma_handle.Init.NbrOfConversion 1;g_adc_dma_handle.Init.DiscontinuousConvMode DISABLE;g_adc_dma_handle.Init.NbrOfDiscConversion 0;g_adc_dma_handle.Init.ExternalTrigConv ADC_SOFTWARE_START;HAL_ADC_Init(g_adc_dma_handle);HAL_ADCEx_Calibration_Start(g_adc_dma_handle);adc_ch_conf.Channel ADC_CHANNEL_1;adc_ch_conf.Rank ADC_REGULAR_RANK_1;adc_ch_conf.SamplingTime ADC_SAMPLETIME_239CYCLES_5;HAL_ADC_ConfigChannel(g_adc_dma_handle, adc_ch_conf);HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 3, 3);HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);HAL_DMA_Start_IT(g_dma_adc_handle, (uint32_t)ADC1-DR, mar, 0);HAL_ADC_Start_DMA(g_adc_dma_handle, mar ,0);
}/* ADC MSP初始化函数 */
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{if(hadc-Instance ADC1){GPIO_InitTypeDef gpio_init_struct;RCC_PeriphCLKInitTypeDef adc_clk_init {0};__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_ADC1_CLK_ENABLE();gpio_init_struct.Pin GPIO_PIN_1;gpio_init_struct.Mode GPIO_MODE_ANALOG;HAL_GPIO_Init(GPIOA, gpio_init_struct); adc_clk_init.PeriphClockSelection RCC_PERIPHCLK_ADC;adc_clk_init.AdcClockSelection RCC_ADCPCLK2_DIV6;HAL_RCCEx_PeriphCLKConfig(adc_clk_init);}
}/* 使能一次ADC DMA传输函数 */
void adc_dma_enable(uint16_t cndtr)
{
// ADC1-CR2 ~(1 0);
//
// DMA1_Channel1-CCR ~(1 0);
// while (DMA1_Channel1-CCR (1 0));
// DMA1_Channel1-CNDTR cndtr;
// DMA1_Channel1-CCR | 1 0;// ADC1-CR2 | 1 0;
// ADC1-CR2 | 1 22;__HAL_ADC_DISABLE(g_adc_dma_handle);__HAL_DMA_DISABLE(g_dma_adc_handle);while (__HAL_DMA_GET_FLAG(g_dma_adc_handle, __HAL_DMA_GET_TC_FLAG_INDEX(g_dma_adc_handle)));DMA1_Channel1-CNDTR cndtr;__HAL_DMA_ENABLE(g_dma_adc_handle);__HAL_ADC_ENABLE(g_adc_dma_handle);HAL_ADC_Start(g_adc_dma_handle);
}/* ADC DMA采集中断服务函数 */
void DMA1_Channel1_IRQHandler(void)
{if (DMA1-ISR (11)){g_adc_dma_sta 1;DMA1-IFCR | 1 1;}
}adc.h
#ifndef __ADC_H
#define __ADC_H#include ./SYSTEM/sys/sys.hvoid adc_dma_init(uint32_t mar);
void adc_dma_enable(uint16_t cndtr);#endif
main.c
#include ./SYSTEM/sys/sys.h
#include ./SYSTEM/usart/usart.h
#include ./SYSTEM/delay/delay.h
#include ./BSP/LED/led.h
#include ./BSP/LCD/lcd.h
#include ./BSP/ADC/adc.h#define ADC_DMA_BUF_SIZE 100 /* ADC DMA采集 BUF大小 */
uint16_t g_adc_dma_buf[ADC_DMA_BUF_SIZE]; /* ADC DMA BUF */extern uint8_t g_adc_dma_sta; /* DMA传输状态标志, 0,未完成; 1, 已完成 */int main(void)
{uint16_t i;uint16_t adcx;uint32_t sum;float temp;HAL_Init(); /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */delay_init(72); /* 延时初始化 */usart_init(115200); /* 串口初始化为115200 */led_init(); /* 初始化LED */lcd_init(); /* 初始化LCD */adc_dma_init((uint32_t)g_adc_dma_buf); /* 初始化ADC DMA采集 */lcd_show_string(30, 50, 200, 16, 16, STM32, RED);lcd_show_string(30, 70, 200, 16, 16, ADC DMA TEST, RED);lcd_show_string(30, 90, 200, 16, 16, ATOMALIENTEK, RED);lcd_show_string(30, 110, 200, 16, 16, ADC1_CH1_VAL:, BLUE);lcd_show_string(30, 130, 200, 16, 16, ADC1_CH1_VOL:0.000V, BLUE); /* 先在固定位置显示小数点 */adc_dma_enable(ADC_DMA_BUF_SIZE); /* 启动ADC DMA采集 */while (1){if (g_adc_dma_sta 1){/* 计算DMA 采集到的ADC数据的平均值 */sum 0;for (i 0; i ADC_DMA_BUF_SIZE; i) /* 累加 */{sum g_adc_dma_buf[i];}adcx sum / ADC_DMA_BUF_SIZE; /* 取平均值 *//* 显示结果 */lcd_show_xnum(134, 110, adcx, 4, 16, 0, BLUE); /* 显示ADCC采样后的原始值 */temp (float)adcx * (3.3 / 4096); /* 获取计算后的带小数的实际电压值比如3.1111 */adcx temp; /* 赋值整数部分给adcx变量因为adcx为u16整形 */lcd_show_xnum(134, 130, adcx, 1, 16, 0, BLUE); /* 显示电压值的整数部分3.1111的话这里就是显示3 */temp - adcx; /* 把已经显示的整数部分去掉留下小数部分比如3.1111-30.1111 */temp * 1000; /* 小数部分乘以1000例如0.1111就转换为111.1相当于保留三位小数。 */lcd_show_xnum(150, 130, temp, 3, 16, 0X80, BLUE); /* 显示小数部分前面转换为了整形显示这里显示的就是111. */g_adc_dma_sta 0; /* 清除DMA采集完成状态标志 */adc_dma_enable(ADC_DMA_BUF_SIZE); /* 启动下一次ADC DMA采集 */}LED0_TOGGLE();delay_ms(100);}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89569.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!