This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
我想利用PWM的上升沿触发中断,每进入一次中断就执行一次ADC操作,这样就可以用PWM的频率控制ADC的采样频率。
上图是我在Notification.c中编辑edgeNotification()的程序,如果像上图那样在中断子程中加入while循环来等待ADC采样完成,串口最终就不能输出任何数据,而如
果去掉等待的这一句,串口会按照PWM的频率输出一串0
我觉得必须得判断ADC是否采样完成才能,但我也知道在中断子程中加入while语句是不符合常理的,所以希望各路高人能指导我一下该如何改写这一段?
拜托各位了
Yinan,
你的想法可以,但是程序设计有问题,首先在中断响应程序里面不要用while(1)之类的等待语句
其次,你可以考虑直接在HALCOGEN中关于ADC的配置中选择硬件的ADC采样触发源为PWM波,这个有硬件支持的,不需要手动去写。
另外如果想要输出ADC的采样值的话,可以建议打开ADC中断,在它的响应程序里面去调用UART的发送程序。
谢谢
Ken,
非常感谢!在你的指导下,我在Halcogen中找到了用PWM触发ADC的选项。
我对这个触发方式的理解是这样的,首先,PWM的上升沿到来时,ADC1进行一次转换,adcIsConversionComplete()函数置1,主函数进行下面的取值以及输出
操作,完成这些操作后,循环回到等待adcIsConversionComplete()=1的一句,直到下次PWM上升沿到来触发ADC完成下一次转换。
我试过了将PWM的周期设为1s,发现整个ADC的采样可以严格地按照1Hz的频率,但是我有些担心提高了PWM的频率(比如60kHz?)之后,会不会造成这样的
后果:在取值以及输出操作尚未完成时,下一次PWM的上升沿已经到来,这样岂不是ADC采样频率就会变为由主程序语句执行的时间所限制而不是由PWM频率决
定了?
谢谢
如果你有这样的担心的话,有几个事情你可以考虑一下,首先PWM频率的设定,需要考虑单次ADC从采样到转换完成需要的时间。PWM触发的周期应该要大于这个时间,特别是当你采用连续采样的时候。
另外如果担心主程序运行时间会影响整个系统的设计,可以考虑用ADC中断处理或是直接用DMA将ADC的转换结果和SCI的发送缓存寄存器联系到一起。这样比较高效。
谢谢