野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8966|回复: 4

新人求助 pwm输入输出程序没反应

[复制链接]
发表于 2017-1-11 15:58:25 | 显示全部楼层 |阅读模式
想用定时器3 其中的两个通道  一个输出PWM   一个输入捕获   弄了半天没反应   

求大神指导  或者哪位大神手里有程序借小弟参考下


下面是我的程序
回复

使用道具 举报

 楼主| 发表于 2017-1-11 15:59:04 | 显示全部楼层
TIM_ICUserValueTypeDef TIM_ICUserValueStructure = {0,0,0,0};

__IO float Frequency = 0;
__IO float DutyCycle = 0;
__IO uint16_t IC2Value = 0;
__IO uint16_t IC1Value = 0;
int main()
{   
    NVIC_Config();
    printf ("检测PWM开始");

   /* 定时器初始化 */
        GENERAL_TIM_Init();

  while(1)
  {     
                printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
        delay_ms (500);
  }
}



void GENERAL_TIM_GPIO_Config(void) //通用定时器PWM输入输出用到的GPIO初始化
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GENERAL_TIM_CH4_PORT, &GPIO_InitStructure);
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

void GENERAL_TIM_Mode_Config(void)
{
       TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
   TIM_OCInitTypeDef  TIM_OCInitStructure;
  // 开启定时器时钟,即内部时钟CK_INT=72M
        GENERAL_TIM_APBxClock_FUN(GENERAL_TIM_CLK,ENABLE);
/*--------------------时基结构体初始化-------------------------*/
        // 自动重装载寄存器的值,累计TIM_Period+1个频率后产生一个更新或者中断
        TIM_TimeBaseStructure.TIM_Period=GENERAL_TIM_PERIOD;  //50-1       
        // 驱动CNT计数器的时钟 = Fck_int/(psc+1)
        TIM_TimeBaseStructure.TIM_Prescaler= GENERAL_TIM_PSC;        //72-1
        // 时钟分频因子 ,配置死区时间时需要用到
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;               
        // 计数器计数模式,设置为向上计数
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;               
        // 重复计数器的值,没用到不用管
        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;       
        // 初始化定时器
        TIM_TimeBaseInit(GENERAL_TIM, &TIM_TimeBaseStructure);
        /*--------------------输出比较结构体初始化-------------------*/       
        // 配置为PWM模式1
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
        // 输出使能
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        // 输出通道电平极性配置       
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        // 输出比较通道 4
        TIM_OCInitStructure.TIM_Pulse = GENERAL_TIM_CCR4;
        TIM_OC4Init(GENERAL_TIM, &TIM_OCInitStructure);
        TIM_OC4PreloadConfig(GENERAL_TIM, TIM_OCPreload_Enable);
   
    TIM_ICInitTypeDef TIM_ICInitStructure;

        // 配置输入捕获的通道,需要根据具体的GPIO来配置
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
        // 输入捕获信号的极性配置
        TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
        // 输入通道和捕获通道的映射关系,有直连和非直连两种
        TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
        // 输入的需要被捕获的信号的分频系数
        TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
        // 输入的需要被捕获的信号的滤波系数
        TIM_ICInitStructure.TIM_ICFilter = 0;
        // 定时器输入捕获初始化
        TIM_ICInit(GENERAL_TIM, &TIM_ICInitStructure);
       
        // 清除更新和捕获中断标志位
    TIM_ClearFlag(TIM3, TIM_FLAG_Update|TIM_IT_CC1);       
    // 开启更新和捕获中断  
        TIM_ITConfig (TIM3, TIM_IT_Update | TIM_IT_CC1, ENABLE );
       
        // 使能计数器
        TIM_Cmd(GENERAL_TIM, ENABLE);
}
/*
  * @brief  通用定时器PWM输出用到的GPIO和PWM模式初始化
  */
void GENERAL_TIM_Init(void)
{
        GENERAL_TIM_GPIO_Config();
        GENERAL_TIM_Mode_Config();               
}

void TIM3_IRQHandler(void)
{
  /* 清除中断标志位 */
  TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);

  /* 获取输入捕获值 */
  IC1Value = TIM_GetCapture1(TIM3);
  IC2Value = TIM_GetCapture2(TIM3);

        if (IC1Value != 0)
  {
    /* 占空比计算 */
    DutyCycle = (float)((IC2Value+1) * 100) / (IC1Value+1);

    /* 频率计算 */
    Frequency = (72000000/72)/(float)(IC1Value+1);
//                printf("占空比:%0.2f%%   频率:%0.2fHz\n",DutyCycle,Frequency);
  }
  else
  {
    DutyCycle = 0;
    Frequency = 0;
  }
}

void NVIC_Config(void)
{
  NVIC_InitTypeDef  NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
   
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
         
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                     
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
                                                                                                          
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 16:01:13 | 显示全部楼层

#define            GENERAL_TIM                   TIM3
#define            GENERAL_TIM_APBxClock_FUN     RCC_APB1PeriphClockCmd
#define            GENERAL_TIM_CLK               RCC_APB1Periph_TIM3
// 输出PWM的频率为 72M/{ (ARR+1)*(PSC+1) }
#define            GENERAL_TIM_PERIOD            (50-1)
#define            GENERAL_TIM_PSC               (72-1)


#define            GENERAL_TIM_CCR4                2



// TIM3 输出比较通道4
#define            GENERAL_TIM_CH4_GPIO_CLK      RCC_APB2Periph_GPIOB
#define            GENERAL_TIM_CH4_PORT          GPIOB
#define            GENERAL_TIM_CH4_PIN           GPIO_Pin_1

/**************************函数声明********************************/

void GENERAL_TIM_Init(void);

//int SCAN_FRE(void);
void PWM_TIM_Init(void);
void PWM_TIM_Config(void);
typedef struct
{   
        unsigned char   Capture_FinishFlag;   // 捕获结束标志位
        unsigned char   Capture_StartFlag;    // 捕获开始标志位
        unsigned short  Capture_CcrValue;     // 捕获寄存器的值
        unsigned short  Capture_Period;       // 自动重装载寄存器更新标志
}TIM_ICUserValueTypeDef;

extern TIM_ICUserValueTypeDef TIM_ICUserValueStructure;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-11 16:02:02 | 显示全部楼层
大多是拿火哥的例程涂涂改改   然后就没反应了
回复 支持 反对

使用道具 举报

发表于 2018-12-22 10:31:33 | 显示全部楼层
解决了吗,我也遇到了,debug全速运行四次才有反应
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-20 01:15 , Processed in 0.032178 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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