ch32v003在ADC采集中,数据不变化,DMA采集也是一样的问题解决

在制作一个PD诱骗器时,使用到CH224K来诈骗,使用CH32V003实现电压切换,切换完后使用ch32v003 adc+dma采集电压,使用中断模式,但是在实现测试中,ADC采集输出数据始终在470—550之间,无论电压是否变化,

544  526  477  512  473  512   473   512   473   512
通过排查,最后发现是用MounRiver Studio生成的程序框架中,默认使用的是外部晶振,HSE,

在system_ch32v00x.c文件中,红色的为默认的,绿色的是修改后的

修改之后,再从串口助手查看数据,就正常了。

### CH32V003 单片机 ADC 模数转换器使用教程 #### 初始化配置 为了使能并初始化CH32V003ADC模块,需先设置相应的寄存器参数。具体操作如下: 1. **开启时钟** 需要通过`RCC_APB2PeriphClockCmd()`函数来打开APB2总线上外设的时钟供应,其中包括了ADC所需的时钟信号。 2. **配置GPIO引脚** 将用于模拟输入的GPIO端口配置成模拟模式,这可以通过调用`GPIO_Init()`完成,指定对应通道作为ADC输入源。 3. **设定采样时间** 对于每一个可能被使用的ADC通道,在结构体变量里定义其对应的采样周期长度,从而影响最终测量精度与速度之间的平衡关系。 4. **启动校准过程** 执行一次性的硬件自检程序以确保读取数值准确性,即执行`ADC_StartCalibration(ADC1)`命令等待返回成功标志后再继续后续流程。 5. **激活连续扫描模式** 如果希望持续断地获取多个通道的数据,则可以启用此特性;反之则只需简单触发单次转换即可满足需求。 6. **编写回调处理逻辑** 当每次转换结束事件发生时会自动跳转到预先注册好的中断服务例程(ISR),在此处实现对接收到的新鲜数据进一步加工分析的任务。 7. **实际采集样本** 发送指令让设备正式开始工作——无论是立即生效还是延迟一段时间之后再行动都取决于应用程序的具体要求。 ```c #include "ch32v003.h" void ADC_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; /* Enable the peripheral clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); /* Configure PA0 as analog input */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Initialize and configure ADC parameters */ ADC_DeInit(); ADC_InitStructure.ADC_ScanConvMode = DISABLE; // Single channel conversion mode ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;// One shot conversion mode ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC1,&ADC_InitStructure); /* Select Channel 0 with sample time set to 239 cycles */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5); /* Start calibration of ADC module */ while (ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while (ADC_Get CalibrationStatus(ADC1)); /* Enable ADC */ ADC_Cmd(ADC1, ENABLE); } uint16_t Read_ADC_Value(){ uint16_t adc_value=0; /* Start single software conversion */ ADC_SoftwareStartConvCmd(ADC1,ENABLE); /* Wait until end-of-conversion flag is raised */ while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC )); /* Get converted value from data register */ adc_value = ADC_GetConversionValue(ADC1); return adc_value; } ``` 上述代码展示了如何针对CH32V003系列MCU中的ADC功能进行基本配置和简单的阻塞式读取方法[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值