求助,PWM和ADC中断转换,PWM不正常

2019-07-21 00:21发布

       我刚学STM32,板子是F103mini,这个困扰我好几天了,麻烦解答一下,感激不尽!!!

       PWM、ADC单独使用都没问题。我是用定时器1输出PWM来控制舵机,ADC转换传感器的模拟量(ADC中断读取,禁止扫描模式,连续转换,ADC时钟9MHZ)。通过ADC转换后的数值来判断情况,再调PWM占空比。但两个一起用就不行,原本舵机我让它0~180度来回转动,加了ADC初始化后,舵机就一卡一卡的。用示波器看PWM的波形,它变化幅度、频率都不稳定。(是不是我的ADC采样时间有问题)

      同样PWM加上个基本定时器中断之后(500ms输出一次串口,输出操作是写在主函数里的),PWM和串口都用不了,单独使用没问题。基本定时器初始化用了就立马不行。是定时器中断太频繁了影响PWM吗?还是PWM的定时器初始化和基本定时器初始化哪里冲突了?刚学32,好多不懂,求解答!谢谢了

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
ExtremeHoly
1楼-- · 2019-07-21 04:52
edmund1234 发表于 2019-6-2 15:32
unsigned char x=45;
改为
unsigned short x=45;

今天换了个ADC+DMA读取就没影响了。虽然不知道为什么ADC中断不行,但不管了
edmund1234
2楼-- · 2019-07-21 09:55
把代码贴出来吧
ExtremeHoly
3楼-- · 2019-07-21 10:43
 精彩回答 2  元偷偷看……
ExtremeHoly
4楼-- · 2019-07-21 12:39
 精彩回答 2  元偷偷看……
ExtremeHoly
5楼-- · 2019-07-21 16:49
edmund1234 发表于 2019-6-1 17:33
把代码贴出来吧

嗯,我把main放下面了,完整的下面也上传了附件,麻烦看看
edmund1234
6楼-- · 2019-07-21 18:43
ExtremeHoly 发表于 2019-6-1 17:59
嗯,我把main放下面了,完整的下面也上传了附件,麻烦看看


uint16_t        PwmC=17;


int main(void)
    {   
        
        ALL_Init();                    //  多个模块初始化

        
        while (1)
        {
            if (!PwmC) {
                PwmC=17;

                PWM_around();            //  循环转动舵机
            }
                    
            Usart_printf();            //  定时器中断串口输出AD值
        
            Scan_fire();            //  扫描到火焰时操作
            
        }
    }



  void PWM_around(void)
    {
            static u8 Mode=0;
        
            TIM1->CCR1=x;
        
            if (!Mode){        // 45 to 255
                    x+=2;
                    if (x>=255) {
                        Mode=1;
                        x=255;
                    }
            }
            else{
                x-=2;
                if (x<=45){
                    Mode=0;
                    x=45;
                }
            }

    }

    void  BASIC_TIM_IRQHandler (void)
    {


        if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
        {   
            time++;
            if (PwmC)
                PwmC--;

            TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);  
        }            
    }


只改了红 {MOD}标记处, 加了一个全局变量, 试一下吧




一周热门 更多>