OpenEdv-开源电子网

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

求助 TIM3定时器产生PWM 通过上位机 修改频率 输出异常

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-12-19
在线时间
4 小时
发表于 2017-12-19 14:39:47 | 显示全部楼层 |阅读模式
1金钱
    我现在用STM32F101C8   TIM3  1通道的定时器   产生PWM  能过上位机来修改PWM的频率  较高频率时有输出  但发现不正常  象是一直在配置     比如1K    较低频率时 比如50HZ  则没有输出  只能抓到一些脉冲     当我在配置完后加较大的延迟  则会有输出  频率也对  但好象也在一直配置刷新   我直接贴代码    麻烦大家看看   原子也看看  求教   


int main(void)
{

       
                RCC_Configuration();                //éèÖÃÏμí3ê±ÖóÎa72MHZ(Õa¸ö¿éòÔ¸ù¾YDèòa¸Ä)
          NVIC_Configuration();                //STM32ÖD¶ÏÏò῱íÅäÅäÖÃ
                delay_init();
        //  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //éèÖÃNVICÖD¶Ï·Ö×é2:2λÇàÕ¼óÅÏè¼¶£¬2λÏìó|óÅÏè¼¶
    RS422_Init(115200);               
        //        delay_ms(1);
       
                PD_Init();
          EB_Init();
          DIR_Init();
          DETECT_1_Init();
          DETECT_2_Init();
       
                TIM3_PWM_Init(2500,144-1);                        //2úéú20KHz μ&#196WM
          TIM_SetCompare1(TIM3,1250);     //Õ¼¿Õ±è¿ØÖÆ
    TIM_Cmd(TIM3,ENABLE);

        while (1)
        {
           DATA_CTL();
////         STATE_TEMP1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14);
////   STATE_TEMP2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
                if(ts_buf[1] == 0x01)
                        GPIO_ResetBits(GPIOA,GPIO_Pin_1);       
         if (ts_buf[2] == 0x01)
                 GPIO_SetBits(GPIOA,GPIO_Pin_1);         
                 if (ts_buf[3] == 0x01)
                            GPIO_SetBits(GPIOA,GPIO_Pin_2);
                   if (ts_buf[3] == 0x02)
                         GPIO_ResetBits(GPIOA,GPIO_Pin_2);
                                            if(ts_buf[4] == 0x01)                                 
                                             {
                                      STATE_TEMP1 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14);
                                      STATE_TEMP2 = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);
                                                    if(STATE_TEMP1 == 0)
                                                                  GPIO_SetBits(GPIOA,GPIO_Pin_1);       
                                                          if(STATE_TEMP2 == 0)
                                                                  GPIO_ResetBits(GPIOA,GPIO_Pin_2);
                                                          if(STATE_TEMP1 == 1)
                                                                  GPIO_ResetBits(GPIOA,GPIO_Pin_1);       
                                                          if(STATE_TEMP2 == 1)
                                                                  GPIO_ResetBits(GPIOA,GPIO_Pin_2);                                                                 
                                             }
//   
                fre_1 = ts_buf[5];
    fre_2 = ts_buf[6];               
    fre_3 = ts_buf[7];                       
    data_mid = ((u32)fre_1 << 16) | ((u32)fre_2 << 8) | ((u32)fre_3);               
//       
               
//          delay_ms(10);                                                                  
                fre_set = (u16)(0x3D090 / data_mid);
                fre_set_1 = fre_set;                         
                fre_zkb = (u16)(fre_set/2);
                fre_zkb_1 = fre_zkb;
                                                         
//                SetValue1(fre_zkb_1,fre_set_1);
//        //        delay_ms(100);
//                //TIM_SetAutoreload(TIM3,fre_set);
    TIM3_PWM_Init(fre_set_1-1,144-1);                        //2úéú20KHz μ&#196WM
                //delay_ms(10);       
          TIM_SetCompare1(TIM3,fre_zkb_1);     //&#213;&#188;&#191;&#213;±è&#191;&#216;&#214;&#198;       
                delay_ms(2000);       
                                                 
//    TIM_Cmd(TIM3,DISABLE);                                                         
//                                            
//                      if(STATE_TEMP1 == 0)
//                             GPIO_SetBits(GPIOA,GPIO_Pin_2);       
//                if(STATE_TEMP2 == 0)
//                            GPIO_ResetBits(GPIOA,GPIO_Pin_2);
        //        delay_ms(1000);
          
               
               
        }
}


void  DATA_CTL(void)
{
                u8 *p;
                u8 a = 7;
                p = &a;
        //        delay_ms(300);
                RS422_Receive_Data(rs_buf, p);
          
                if((rs_buf[0] == 0x0a)&&(rs_buf[8] == 0x0b))
                {
          ts_buf[0] = rs_buf[0];
          ts_buf[1] = rs_buf[1];
           ts_buf[2] = rs_buf[2];
          ts_buf[3] = rs_buf[3];
          ts_buf[4] = rs_buf[4];
          ts_buf[5] = rs_buf[5];
          ts_buf[6] = rs_buf[6];
          ts_buf[7] = rs_buf[7];
          ts_buf[8] = rs_buf[8];
                }
        else
        {
    ts_buf[0] = 0;
          ts_buf[1] = 0;
          ts_buf[2] = 0;
          ts_buf[3] = 0;
          ts_buf[4] = 0;
          ts_buf[5] = 0;
          ts_buf[6] = 0;
          ts_buf[7] = 0;
          ts_buf[8] = 0;               
                }
               
}



下面是TIM的配置  
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       
//        TIM_DeInit(TIM3);
//        TIM_InternalClockConfig(TIM3);
       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //ê1&#196;ü&#182;¨ê±&#198;÷3ê±&#214;ó
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);  //ê1&#196;üGPIOíaéèoíAFIO&#184;′ó&#195;1|&#196;ü&#196;£&#191;éê±&#214;ó
       
        //TIM_InternalClockConfig(TIM3);
        //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer32&#191;·&#214;&#214;&#216;ó3é&#228;  TIM3_CH2->B5   

   //éè&#214;&#195;&#184;&#195;òy&#189;&#197;&#206;a&#184;′ó&#195;ê&#228;3&#246;1|&#196;ü,ê&#228;3&#246;TIM3 CH2μ&#196WM&#194;&#246;3&#229;2¨D&#206;        GPIOB.5
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH2
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //&#184;′ó&#195;í&#198;íìê&#228;3&#246;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);//3&#245;ê&#188;&#187;ˉGPIO
// GPIO_SetBits(GPIOA,GPIO_Pin_7);       
   //3&#245;ê&#188;&#187;ˉTIM3
        TIM_TimeBaseStructure.TIM_Period = arr; //éè&#214;&#195;&#212;ú&#207;&#194;ò&#187;&#184;&#246;&#184;üD&#194;ê&#194;&#188;t×°è&#235;&#187;&#238;&#182;ˉμ&#196;×&#212;&#182;ˉ&#214;&#216;×°&#212;&#216;&#188;&#196;′&#230;&#198;÷&#214;ü&#198;úμ&#196;&#214;μ
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //éè&#214;&#195;ó&#195;à′×÷&#206;aTIMxê±&#214;ó&#198;μ&#194;ê3yêyμ&#196;&#212;¤·&#214;&#198;μ&#214;μ
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //éè&#214;&#195;ê±&#214;ó·&#214;&#184;&#238;:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM&#207;òé&#207;&#188;&#198;êy&#196;£ê&#189;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //&#184;ù&#190;YTIM_TimeBaseInitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉTIMxμ&#196;ê±&#188;&#228;&#187;ùêyμ¥&#206;&#187;
       
        //3&#245;ê&#188;&#187;ˉTIM3 Channel2 PWM&#196;£ê&#189;         
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //&#209;&#161;&#212;&#241;&#182;¨ê±&#198;÷&#196;£ê&#189;:TIM&#194;&#246;3&#229;&#191;í&#182;èμ÷&#214;&#198;&#196;£ê&#189;2
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è&#189;&#207;ê&#228;3&#246;ê1&#196;ü
        TIM_OCInitStructure.TIM_Pulse = 0;     
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê&#228;3&#246;&#188;&#171;D&#212;:TIMê&#228;3&#246;±è&#189;&#207;&#188;&#171;D&#212;&#184;&#223;
        TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //&#184;ù&#190;YT&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉíaéèTIM3 OC2

        TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);  //ê1&#196;üTIM3&#212;úCCR2é&#207;μ&#196;&#212;¤×°&#212;&#216;&#188;&#196;′&#230;&#198;÷
        TIM_ARRPreloadConfig(TIM3, ENABLE);
        //TIM_CtrlPWMOutputs(TIM3,ENABLE);
        //TIM_GenerateEvent(TIM3,TIM_EventSource_Update);

        TIM_Cmd(TIM3, ENABLE);  //ê1&#196;üTIM3
       
}

//void SetValue1(u16 g,u16 arr)
//{
//        //&#184;ù&#190;Y&#209;&#213;é&#171;&#214;μDT&#184;&#196;&#182;¨ê±&#198;÷μ&#196;±è&#189;&#207;&#188;&#196;′&#230;&#198;÷&#214;μ
//       
//        TIM3->CCR1 = g;       

//  TIM3->ARR = arr;
//       
//}

//&#182;¨ê±&#198;÷3&#214;D&#182;&#207;·t&#206;&#241;oˉêy
void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //ò&#231;3&#246;&#214;D&#182;&#207;
        {
        //        PWM=!PWM;
        }
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-12-19
在线时间
4 小时
 楼主| 发表于 2017-12-19 14:43:27 | 显示全部楼层
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2017-12-19
在线时间
4 小时
 楼主| 发表于 2017-12-19 16:20:00 | 显示全部楼层
没有人回答啊  
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-12-21 23:51:21 | 显示全部楼层
帮顶
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 04:48

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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