1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的目的是采样外部连接PA1,PA2两个模拟信号,以及内部16通道的内部温度。
使用注入方式采样,由外部定时器事件触发,然后ADC连续采样3个通道,最后触发ADC_IT_JEOC中断进行处理 实验的初始化代码如下 void ad_init(void) { memset(&ad, 0, sizeof(ad)); ADC_InitTypeDef ADC_InitStructure = { 0 }; GPIO_InitTypeDef GPIO_InitStructure = { 0 }; NVIC_InitTypeDef NVIC_InitStructure = { 0 }; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div8); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 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(GPIOA, &GPIO_InitStructure); // ADC1->CTLR1 = 0x00000180; // ADC1->CTLR2 = 0x00808801; // ADC1->ISQR = 0x00204020; // ADC1->SAMPTR1 = 0x00080000; // ADC1->SAMPTR2 = 0x00000012; ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigInjecConv_T1_TRGO; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 0; ADC_Init(ADC1, &ADC_InitStructure); ADC_InjectedDiscModeCmd(ADC1, DISABLE); ADC_ExternalTrigInjectedConvCmd(ADC1, ENABLE); ADC_InjectedSequencerLengthConfig(ADC1, 3); ADC_InjectedChannelConfig(ADC1, ADC_Channel_1, 0,ADC_SampleTime_28Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_2, 1,ADC_SampleTime_28Cycles5); ADC_InjectedChannelConfig(ADC1, ADC_Channel_16, 2,ADC_SampleTime_28Cycles5); ADC_ITConfig(ADC1, ADC_IT_JEOC, ENABLE); ADC_Cmd(ADC1, ENABLE); Delay_Us(50); ADC_TempSensorVrefintCmd(ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); Calibrattion_Val = Get_CalibrationValue(ADC1); NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void timer_init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = { 0 }; //定时器1的刷新时间触发AD采样 RCC_APB2PeriphClockCmd( RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseInitStructure.TIM_Period = 56250; //=72000000/12800 TIM_TimeBaseInitStructure.TIM_Prescaler = 0; //不分频 TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV4; TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_ARRPreloadConfig(TIM1, ENABLE); TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update); TIM_Cmd(TIM1, ENABLE); } 首先发现了一个bug ADC_InjectedChannelConfig函数的描述内rank的解释有问题他的取值范围说明是1~4,但实测是0~3. 在中断内读取ADC1->IDATAR1~ADC1->IDATAR3,发现他们的值居然不随外部的电压变化,经使用demo测试判断硬件是没有问题的。 这个问题已经折腾2天,目前没有任何进展,望技术支持 |
|
相关推荐
2个回答
|
|
有两处需要注意一下:
1、若程序中用到中断,注意要加中断声明,即需要采用__attribute__((interrupt("WCH-Interrupt-fast")))声明,具体可参照下图 2、使用ADC时,由于ADC内部通道和外部通道共用一个转换单元,同时使用时,需要先将内部通道使能关掉,待外部通道采样完成再开启使能内部通道。 关于你反馈的ADC_InjectedChannelConfig函数 rank配置问题,首先感谢你的反馈,但rank的值为1-4应该是没问题的,具体可看ADC注入通道序列寄存器(ADC_ISQR),如下图。后续若有问题,可通过邮箱(lzs@wch.cn)跟我联系 |
|
|
|
原因就是启用了内部的温度通道,导致外部采样无法采样
|
|
|
|
只有小组成员才能发言,加入小组>>
522 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2904 浏览 2 评论
2400 浏览 1 评论
870浏览 2评论
688浏览 1评论
riscv-none-embed-objcopy: \'PWM_Output.elf\': No such file这个咋解决,
418浏览 1评论
525浏览 1评论
请教一下,Mounriver 编译不成功:找不到库文件,怎么整
814浏览 1评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 07:04 , Processed in 1.248435 second(s), Total 81, Slave 64 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号