OpenEdv-开源电子网

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

萌新求救,只有2金钱了,帮帮孩子吧

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-7-7
在线时间
7 小时
发表于 2020-7-10 09:53:30 | 显示全部楼层 |阅读模式
1金钱
想用TIM1生成CH3N周期为216ms且占空比为0.2%,CH2N周期为300us且占空比为50%,而且让CH2N比CH3N滞后75us,有没有大佬帮我看看错哪了
static void TIM1_Mode_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
/*--------------------中断优先级NVIC设置-------------------------*/
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;           //TIM1捕获比较中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;    //先占优先级1级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;           //从优先级1级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;              //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);                              //初始化NVIC寄存器
TIM_ITConfig(TIM1, TIM_IT_CC2 | TIM_IT_CC3, ENABLE);         //通道2、通道3中断使能
/*--------------------时基结构体初始化-------------------------*/
TIM_TimeBaseStructure.TIM_Period= 10799;                        //ARR+1=24=1M*T, T=24us?
TIM_TimeBaseStructure.TIM_Prescaler= 71;                    //配置1M计数
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //配置死区时间
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式  
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;               //重复计数器的值,没用到不用管
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);              //初始化TIMx的时间基数单位
/*--------------------输出比较结构体初始化-------------------*/  
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_Toggle;             //配置为Toggle模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;  //输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;      //输出通道电平极性配置
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;    //互补输出通道电平极性配置
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;     //输出通道空闲电平极性配置
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;   //互补输出通道空闲电平极性配置

/*--------------------输出比较通道2-------------------------*/
TIM_OCInitStructure.TIM_Pulse = 300;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
/*--------------------输出比较通道3-------------------------*/
  TIM_OCInitStructure.TIM_Pulse = 21600;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
// 使能计数器
TIM_Cmd(TIM1, ENABLE);
// 主输出使能,当使用的是通用定时器时,这句不需要
TIM_CtrlPWMOutputs(TIM1, ENABLE);

}
中断服务函数
void TIM1_CC_IRQHandler(void)
{
  if (TIM_GetITStatus(TIM1, TIM_IT_CC2) != RESET)
  {
  u16 capture = 0;
  TIM_ClearITPendingBit(TIM1, TIM_IT_CC2 );   
   capture = TIM_GetCapture2(TIM1);      
   TIM_SetCompare2(TIM1, capture  );  
  }
  if (TIM_GetITStatus(TIM1, TIM_IT_CC3) != RESET)
  {
     u16 capture = 0;
  
     TIM_ClearITPendingBit(TIM1, TIM_IT_CC3);
   capture = TIM_GetCapture3(TIM1);
   if(state==0)   
     {   
         TIM_SetCompare3(TIM1, capture + 21600* 0.02 );   
         state=1;   
     }   
     else   
     {   
       TIM_SetCompare3(TIM1, capture + 21600 * 0.98 );   
       state=0;   
   }
  }
}


最佳答案

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

采用了TIM1_CH2N,引脚为PB1,所以必须重映射。 中断服务函数没有问题,这种思想和方法都是对的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-7-7
在线时间
7 小时
 楼主| 发表于 2020-7-10 09:53:31 | 显示全部楼层
采用了TIM1_CH2N,引脚为PB1,所以必须重映射。
中断服务函数没有问题,这种思想和方法都是对的。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-11 02:25:25 | 显示全部楼层
下载测试
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2020-7-7
在线时间
7 小时
 楼主| 发表于 2020-7-13 08:34:11 | 显示全部楼层

我测试过了呀,不过我现在搞懂了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 22:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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