完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
UINT16 abcBuff[12] = {0};
UINT8 adclen = 0; GPIOA_ModeCfg(GPIO_Pin_4,GPIO_ModeIN_Floating); int16_t ADC_Key(void) { UINT8 i = 0; UINT16 AdcValue=0; ADC_ExtSingleChSampInit(SampleFreq_3_2,ADC_PGA_0); ADC_ChannelCfg( 0 ); adclen = 0; // for( i = 0; i < 12; i++ ) // { // abcBuff = ADC_ExcutSingleConver(); // 连续采样20次 // } ADC_ClearITFlag(); PFIC_EnableIRQ( ADC_IRQn ); ADC_StartUp(); while( adclen < 12 ) ; PFIC_DisableIRQ( ADC_IRQn ); for( i = 2; i < 12; i++ ) AdcValue += abcBuff; AdcValue /= 10; return AdcValue; } __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void ADC_IRQHandler( void ) //adc中断服务程序 { if( ADC_GetITStatus() ) { ADC_ClearITFlag(); if( adclen < 12 ) { abcBuff[adclen] = ADC_ReadConverValue(); ADC_StartUp(); // 作用清除中断标志并开启新一轮采样 } adclen++; } } 这是ADC部分的代码,如果不用中断是可以正常的,用中断的话经过调试发现会卡在如图所示地方 但是不用中断的话,测量时有时AD值会突然变成4095,麻烦帮忙看一下 |
|
相关推荐
3个回答
|
|
用volatile修饰adclen试试看呢,
关于不用中断测量时突然变成4095可以把你的现象描述的更具体一点,是在外部输入电压没变时,突然变成4095嘛,可以加上测试结果和说明看看。 |
|
|
|
我用volatile修饰了adclen中断还是用不了,
是ADC通道1外接的是一个热敏温度传感器,就是比如正常温度AD值是2000多,有时AD值会突然变成4095,然后就恢复正常了,不知道是没用ADC中断的问题还是线路的问题,我已经先做了均值滤波,然后12个数据升序排列,去中间四组数再取平均值还是会出现这种情况。 |
|
|
|
加上volatile应该就可以了,这边我只看你写了一个函数,主函数里面具体是如何写的,跟我们的例程保持一致就是可以用的,
如果依然不可以,那么就加点打印,看看有没有进中断,如果进了中断,又使用volatile修饰,那么程序就不会卡在那个while。 |
|
|
|
只有小组成员才能发言,加入小组>>
477 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2874 浏览 2 评论
2361 浏览 1 评论
820浏览 2评论
CH569通过HSPI实现USB3.0和FPGA高速双向通讯
650浏览 1评论
502浏览 1评论
CH32F103C8T6使用当前官网上的CDC例程会出现设备描述符请求失败
366浏览 1评论
644浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-27 18:33 , Processed in 0.907696 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号