OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4113|回复: 4

使用pwm控制电机的程序中,添加了adc,电机无法正常工作

[复制链接]

17

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2021-9-6
在线时间
59 小时
发表于 2021-12-31 17:08:29 | 显示全部楼层 |阅读模式
1金钱
主程序:


u16 adcx;
    float temp;
    delay_init();                                    //ÑÓʱº¯Êý³õʼ»¯   
  uart1_init(9600);         //´®¿Ú³õʼ»¯Îª9600     
    Adc_Init();        
    LCD_Init();
    LED_Init();                                          //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
    DIR_Init();                                      //µç»úIO¿Ú³õʼ»¯
    TIM4_PWM_Init(9999,35);               //¶¨Ê±Æ÷³õʼ»¯
  TIM_SetCompare1(TIM4,4999);            //ÉèÖÃÕ¼¿Õ±ÈΪ50%
    SineWave_GPIO_Config();         //sin²¨³õʼ»¯io
    SineWave_TIM_Config();          //³õʼ»¯¶¨Ê±Æ÷
    SineWave_DAC_Config();          //ÅäÖÃDAC
     SineWave_DMA_Config();          //ÅäÖÃDMA
    sine_wave(SINE_WAVE_DATA_MAX);  //sin²¨ÐÎÅäÖÃ
    POINT_COLOR=RED;//ÉèÖÃ×ÖÌåΪºìÉ«
    LCD_ShowString(60,50,200,16,16,"Mini STM32");   
    LCD_ShowString(60,70,200,16,16,"ADC TEST");   
    LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
    LCD_ShowString(60,110,200,16,16,"2014/3/9");    //ÏÔʾÌáʾÐÅÏ¢
    POINT_COLOR=BLUE;//ÉèÖÃ×ÖÌåΪÀ¶É«
    LCD_ShowString(60,130,200,16,16,"ADC_CH1_VAL:");         
    LCD_ShowString(60,150,200,16,16,"ADC_CH1_VOL:0.000V");        
     
     
   
    while(1)
    {        
            adcx=Get_Adc_Average(ADC_Channel_7,10);
        LCD_ShowxNum(156,130,adcx,4,16,0);//ÏÔʾADCµÄÖµ
        temp=(float)adcx*(3.3/4096);
        adcx=temp;
        LCD_ShowxNum(156,150,adcx,1,16,0);//ÏÔʾµçѹֵ.
        printf("%f",temp);
        temp-=adcx;
        temp*=1000;
        LCD_ShowxNum(172,150,temp,3,16,0X80);
        LED0=!LED0;
        delay_ms(250);   
        if(t==900)                    //¹Ø±Õsin²¨ÐÎÊä³ö
        {
            TIM_Cmd(TIM2, DISABLE);
        }


步进电机程序:
#include "timer.h"
#include "led.h"
#include "usart.h"

int t=0;
//DIR¡ª¡&#170B5³õʼ»¯
void DIR_Init(void)
{   
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);     
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;         
GPIO_Init(GPIOB, &GPIO_InitStructure);                     
GPIO_SetBits(GPIOB,GPIO_Pin_5);                                         
}

//TIM4³õʼ»¯
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
    //½á¹¹Ìå
    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   
    //ʹÄÜʱÖÓ
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  
      
  //ÉèÖøÃÒý½ÅΪ¸´ÓÃÊä³ö¹¦ÄÜ,Êä³öTIM4 CH1µ&#196WMÂö³å²¨ÐΠ   GPIOB.6
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //¸´ÓÃÍÆÍìÊä³ö
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
  //ÉèÖö¨Ê±Æ÷²ÎÊý
  TIM_TimeBaseStructure.TIM_Period = arr;
    TIM_TimeBaseStructure.TIM_Prescaler =psc;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
   
  //ÖжÏÉèÖÃ
    TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);  
   
    //³õʼ»¯TIM4 Channel1
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIM4, &TIM_OCInitStructure);  

    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  
  TIM_Cmd(TIM4, ENABLE);  //ʹÄÜTIM4
}
//¶¨Ê±Æ÷4ÖжϷþÎñ³ÌÐò
void TIM4_IRQHandler(void)   
{
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //¼ì²éÖ¸¶¨µÄTIMÖжϷ¢ÉúÓë·ñ:TIM ÖжÏÔ´
    {
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //Çå³ýTIMxµÄÖжϴý´¦Àíλ:TIM ÖжÏÔ´
        LED1 = !LED1;
        t++;
            if(t==450)
        {
            DIR = !DIR;
        }
        if(t==900)
        {
                TIM_Cmd(TIM4, DISABLE);
        }
}
}

adc程序用的就是例程里的


最佳答案

查看完整内容[请看2#楼]

冲突了。。,你可以把adc用dma传输看看,效果会好很多
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2020-3-15
在线时间
28 小时
发表于 2021-12-31 17:08:30 | 显示全部楼层
冲突了。。,你可以把adc用dma传输看看,效果会好很多
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3625
金钱
3625
注册时间
2019-8-14
在线时间
1054 小时
发表于 2022-1-2 12:49:03 | 显示全部楼层
检查IO有没有冲突,冲突的话,换个IO开ADC看下
回复

使用道具 举报

17

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2021-9-6
在线时间
59 小时
 楼主| 发表于 2022-1-4 14:17:47 | 显示全部楼层
STM32TSZ 发表于 2021-12-31 17:50
冲突了。。,你可以把adc用dma传输看看,效果会好很多

电机我用PB5和PB6控制,adc用PA7
回复

使用道具 举报

17

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
456
金钱
456
注册时间
2021-9-6
在线时间
59 小时
 楼主| 发表于 2022-1-4 14:18:12 | 显示全部楼层
hou18 发表于 2022-1-2 12:49
检查IO有没有冲突,冲突的话,换个IO开ADC看下

电机我用PB5和PB6控制,adc用PA7
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-21 02:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表