济南制作网站公司吗app开发公司 无冬
news/
2025/9/26 3:33:50/
文章来源:
济南制作网站公司吗,app开发公司 无冬,网页设计作业古诗,wordpress 修改注册目录
一、工程依赖的硬件
二、设计目的
三、建立工程
1、配置GPIO
2、配置中断
3、配置串口
4、配置ADC
5、选择时钟源和Debug
6、配置系统时钟和ADC时钟
四、设置采样频率
五、代码修改
1、重定义外部中断回调函数
2、启动ADC
3、配置printf函数
六、运行并…目录
一、工程依赖的硬件
二、设计目的
三、建立工程
1、配置GPIO
2、配置中断
3、配置串口
4、配置ADC
5、选择时钟源和Debug
6、配置系统时钟和ADC时钟
四、设置采样频率
五、代码修改
1、重定义外部中断回调函数
2、启动ADC
3、配置printf函数
六、运行并查看结果 STM32G4系列MCU的模/数转换器(Analog to Digital Converter,ADC)功能比较强不同的型号所含ADC模块数量不同最多有5个ADC(ADC15);但也并非完全独立其ADC1和ADC2是一对ADC3和ADC4是一对ADC5可独立控制。每个ADC都包含一个12位逐次比较型模/数转换器。此外每个ADC还有最多至19个通道不同的通道具有单次、连续和扫描或断续等采样模式。
一、工程依赖的硬件 文章依赖的硬件及工程配置参考本文作者的其他文章细说ARM MCU的串口接收数据的实现过程-CSDN博客 https://wenchm.blog.csdn.net/article/details/139541112
二、设计目的 在本例子中使用ADC1的一个通道以单次采样的模式采集外部输入直流电压信号。使用NUCLEO-G474RE开发板上的按键B1来启动ADC采样。每按下一次B1键进行一次A/D转换。在代码实现中将通过查询方式判断是否转换完成一旦转换成主程序会从ADC的数据寄存器中读取转换结果并将结果通过串口送出。此外当输入信号的幅值大于一定值时将会点亮板上发光二极管LD2。这个例子用到了ADC、串口入/输出等多个模块。此外A/D转换虽采用查询模式但对按键状态的识别将采用中断方式。 ADC的输入电压范围是03.3 V,所以要确保外部施加的信号不超过此电压范围否则会导致硬件损坏。 本例中采用ADC1的第一个通道对应STM32G474RE的引脚为PA0,在NUCLEG474RE板上通过CN7端子的第28引脚引出。此外按键B1连接的引脚为PC13,LD2的控制引脚为PA5。
三、建立工程
1、配置GPIO 配置PA5为输出(GPIO_Output)默认输出电平Low推挽输出上拉速度High标识为LEDPA5引脚输出高电平时LD2点亮默认的低电平时熄灭 配置PC13为中断模式(GPIO_EXTI13)上升沿触发下拉用户标识为KEY。
2、配置中断 在NVIC中断表中将EXTI line[15:10]interrupts使能并将其抢占式优先级设为2(由于仅用到一个中断级数选择可任意)。
3、配置串口 选择 Connectivity中的 USART2其模式( Mode)选择异步( Asynchronous)其他参数设置均保持默认(波特率为115200 bit/ s)不开启中断。将 USART2的两个引脚 PA2和 PA3均设置为上拉。
4、配置ADC 选择Analog中的ADC1在其模式(Mode)区通道1(IN1)选择IN1 Single-ended(单端)其它参数设置可暂时均保持默认值。时钟预分频参数(Clock Prescaler)选择Asynchronous clock mode dividedby 1(其他选项亦可)。
5、选择时钟源和Debug 使用片外时钟晶体作为HSE的时钟源。在SYS中将Debug设置为Serial Wire。
6、配置系统时钟和ADC时钟 在STM32G474RE的说明文档中给出了其ADC时钟频率的范围。 ADC的最大频率为60 MHz而系统最高频率为170 MHz如果系统频率配置较高生成ADC时钟频率时就需要分频处理。 在本例中没有使用低功耗模式并且是让ADC进行单次采样的所以最高时钟频以达到60 MHz。为了可靠起见本例中配置ADC的时钟频率为34 MHz。 符 号 参 数 条 件 最小值 最大值 fADC/MHz ADC的时钟频率 Rangel单路ADC操作 0.14 60 Range2 —— 26 Range1所有ADCs操作单端模式VDDA≥2.7 V 0.14 52 Range1所有ADCs操作单端模式VDDA≥1.62 V 0.14 42 Rangel单路ADC操作差分模式VDDA≥1.62 V 0.14 56
四、设置采样频率 五、代码修改 打开main.c修改代码。
1、重定义外部中断回调函数 由于希望在产生按键中断时启动ADC采样所以需要重定义外部中断EXTI的回调函数。这个回调函数可以写在main.c文件后面的一个注释对中。这里直接给出它的定义
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_ADC_Start(hadc1);HAL_ADC_PollForConversion(hadc1,10);ADC1ConvertedValue HAL_ADC_GetValue(hadc1);if(ADC1ConvertedValue 2048)HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);elseHAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);printf(ADCResult %d \r\n,ADC1ConvertedValue);
}int __io_putchar(int ch)
{HAL_UART_Transmit(huart2,(uint8_t *)ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */
2、启动ADC 在外部中断回调函数中调用了三个ADC相关的库幽数。 首先是启动ADC用了库函数HAL_ADC_Start(ADC_HandleTypeDef *hadc)。此函数只有一个参数就是ADC结构体变量。由于在硬件配置中用了ADC1所以自动生成的代码中已经给出了它的结构体变量即hadcl。 调用的第二个库函数是
HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc,uint32_t Timeout); 这个函数是以查询方式等待A/D转换过程的结束。该函数的第二个参数是Timeout单位为ms。随后就可以调用库函数HAL_ADC_GetValue(ADC_HandleTypeDef *hadc)来读取A/D转换的结果了。这里用了一个变量ADC1ConvertedValue来存放A/D转换的结果。需要在main.c中定义该变量可以将其放到main函数前的注释对中
/* USER CODE BEGIN PV */
uint16_t ADC1ConvertedValue 0;
/* USER CODE END PV */ 接下来在回调函数HAL_GPIO_EXTI_Callback()中根据A/D采样值的大小控制发光二极管的亮灭。
3、配置printf函数 在回调函数的最后,使用了 printf函数将 A/ D转换的结果通过串口送出。 使用 printf函数从串口送出数据,需要在 main.c中将 stdio.h包含进来此外还要给出 putchar函数的定义。
/* USER CODE BEGIN 4 */
int __io_putchar(int ch)
{HAL_UART_Transmit(huart2,(uint8_t *)ch,1,0xFFFF);return ch;
}
/* USER CODE END 4 */
六、运行并查看结果 编译工程并下载到硬件中将程序运行起来。 打开串口助手程序设置好串口端口和波特率等参数单击“打开串口。 分别用跳线将PA0连接到GND和VDD(3.3 V)上并操作NUCLEO-G474RE板上B1键。可以看到连接到GND时每次送的是0连接到VDD时会每次送来一个接近4095的数如图截图。 STM32G474RE上的ADC是12位的输入电压3.3 V时理论上对应最大转换值为4095。在将PA0连接到VDD上时为什么 ADC的转换结果不是4095呢这是因为板上的VDD并不是稳定的3.3 V而是有偏差的。对于12位ADC如果满量程输入电压为3.3 V则转换结果的每一位对应的电压为3.3/4096 V约为0.0008 V即0.8 mV。从截图中的结果看偏差了几十mV(不同的板子偏差可能会有所不同)。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/917821.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!