2 Replies Latest reply on May 20, 2020 5:44 PM by XiaoweiZ_71

    ADC Interrupt

    chyi_4662656

      嗨,請問一個關於ADC Interrupt的問題,程式ADC的通道(CH0)只有一個,

      為什麼ADC轉換完畢後,程式都會重複進入ADC中斷一次?

      (我預期的程式為ADC轉換完畢後只會進入一次ADC中斷)

       

      附上我的程式流程、執行結果與程式檔案。

       

      提供程式流程:

       

      Step1.  程式初始化時,我會執行ADC_Start(); ADC_IRQ_ENABLE();

       

      Step2. Timer產生中斷後會執行ADC_StartConvert()GPIO訊號(藍色波形)反向 

      一次確認已進入Timer中斷。

       

      Step3.  ADC轉換完畢後會進入ADC中斷,將運算結果取出後,清除旗標,

      GPIO訊號(紅色波形)反向一次確認已進入ADC中斷。

                     

                      CY_ISR(ADC_ISR)

                      {

                              Uint32 intr_status;

                              Intr_status = MotorCur_ADC_SAR_INTR_REG;             

                              //執行GPIO 訊號反向

                              //讀取ADC結果

                              ADC_StopConvert();

                              ADC_SAR_INTR_REG=intr_status;

      }

       

      Step4.  等待Timer中斷產生。

       

      提供示波器波形:

        未命名.jpg

       

        • 1. Re: ADC Interrupt
          LinglingG_46

          I need some time to review and test your code, and give the feedback to you ASAP.

          You could try to use the hardware trigger sample mode instead of the free running, and use the timer OV to trigger the ADC convention.

          • 2. Re: ADC Interrupt
            XiaoweiZ_71

            SARADC 的工作模式是 continuous 模式,ADC 在执行完一次转换之后会直接进入下一次转换(不需要CPU干预),虽然你在 ADC EOS 中断中第一时间调用了 StopConvert(), 但是此时 ADC 已经开始了第二次扫描,所以ADC每次实际执行了两次转换。

             

            如果你希望每次都是单次转换的话,你需要把工作模式修改为 Hardware trigger 模式。这样每调用一次 StartConvert() 函数, ADC 会执行一次采样,然后自动停止。这样你也不需要再ADC 中断中再调用 StopConvert() 来停止 ADC 采样了。

             

            Note: Hardware Trigger - A rising-edge pulse on the SOC pin starts a single conversion. The ADC_StartConvert() function also starts a single conversion