如果要采集两路信号,请修改程序并每一句都加上注释
时间: 2024-02-18 10:06:10 浏览: 49
双路视频采集程序
好的,下面是修改后的程序和注释:
```c
#include "stm32f10x.h" // 引入STM32F103C8T6的头文件
ADC_InitTypeDef ADC_InitStructure; // 初始化ADC的结构体
void ADC1_Init(void) // 初始化ADC1的函数
{
// 使能ADC1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
// ADC的配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; // 独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE; // 开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; // 开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; // 数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 2; // 要转换的通道数
ADC_Init(ADC1, &ADC_InitStructure); // 初始化ADC1
}
void ADC1_GPIO_Configuration(void) // 初始化ADC1所需的GPIO配置
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIOA和GPIOC的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
// 配置PA1和PC1为模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
void USART1_Configuration(void) // 初始化USART1的函数
{
USART_InitTypeDef USART_InitStructure;
// 使能USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
// USART的配置
USART_InitStructure.USART_BaudRate = 9600; // 波特率为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 数据位为8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位为1位
USART_InitStructure.USART_Parity = USART_Parity_No; // 无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Tx; // 只启用发送功能
USART_Init(USART1, &USART_InitStructure); // 初始化USART1
USART_Cmd(USART1, ENABLE); // 使能USART1
}
int main(void)
{
float voltage1, voltage2; // 电压值
ADC1_GPIO_Configuration(); // 初始化ADC1所需的GPIO配置
ADC1_Init(); // 初始化ADC1
USART1_Configuration(); // 初始化USART1
while (1)
{
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5); // 配置要转换的通道1
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_239Cycles5); // 配置要转换的通道2
ADC_SoftwareStartConvCmd(ADC1, ENABLE); // 开始转换
while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); // 等待转换完成
voltage1 = ADC_GetConversionValue(ADC1) * 3.3 / 4096; // 计算电压值1
voltage2 = ADC_GetConversionValue(ADC1) * 3.3 / 4096; // 计算电压值2
printf("V1=%.2fV, V2=%.2fV\r\n", voltage1, voltage2); // 通过串口输出电压值
delay_ms(1000); // 延时1秒
}
}
```
注释中已经详细说明了每句程序的作用,这个程序可以采集两路信号并通过串口输出,只需要根据自己的实际需求进行修改即可。需要注意的是,这里开启了扫描模式和连续转换模式,因此在计算电压值时需要注意是哪个通道的值。
阅读全文