OpenEdv-开源电子网

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

仿真时PWM有输出,下载后管脚没有输出

[复制链接]

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
发表于 2014-11-20 10:36:33 | 显示全部楼层 |阅读模式
5金钱
如题,程序里有两个功能,一是定时器1输出两路PWM,单独仿真和下载进去没有问题,都有输出;
二是通过定时器2周期性中断改变定时器1的脉宽,实现脉宽调节功能,加上这个功能后,仿真可以实现,下载后没输出
什么原因呢?
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
// NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能定时器3时钟
 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
GPIO_ResetBits(GPIOA,GPIO_Pin_8|GPIO_Pin_9); 

   //初始化TIM1
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;  //TIM向上计数模式
// TIM_TimeBaseStructure.TIM_RepetitionCounter = 10;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  TIM_OC2Init(TIM1, &TIM_OCInitStructure); 

// TIM_ClearFlag(TIM1, TIM_FLAG_Update); //清中断,以免一启用中断后立即产生中断
 // TIM_CtrlPWMOutputs(TIM1,ENABLE);
// TIM_Cmd(TIM1, ENABLE);  //使能TIM3

}

void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
 
}

extern u16 Pulse1,Pulse2;
extern u16  ulse_Add; // 5%

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 

if(Pulse_Add==0)
{ TIM_SetCompare1(TIM1,500);
   TIM_SetCompare2(TIM1,500);
}
else
{Pulse_Add=Pulse_Add-25;
    Pulse1=500+Pulse_Add;
    Pulse2=500-Pulse_Add;
TIM_SetCompare1(TIM1,Pulse1);
    TIM_SetCompare2(TIM1,Pulse2);
}
}
 // TIM_CtrlPWMOutputs(TIM1,ENABLE);
 // TIM_Cmd(TIM1, ENABLE);  //使能TIM3

}

int main(void)
 {
// u16 led0pwmval=0;
// u8 dir=1;
delay_init();     //延时函数初始化  
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
// uart_init(9600); //串口初始化为9600
 // LED_Init();     //LED端口初始化
 // TIM3_PWM_Init(899,0); //不分频。PWM频率=72000/900=8Khz 
    TIM3_Int_Init(999,7199);
  TIM1_PWM_Init(999,0);        //预分频9,PWM频率=72000000/1000=72khz    定时器输出频率的计算公式:f(OC1) = 72,000,000 / (ARR - 1)*(PSC - 1);
TIM_SetCompare1(TIM1,500+475);
TIM_SetCompare2(TIM1,500-475);
 TIM_CtrlPWMOutputs(TIM1,ENABLE);
TIM_Cmd(TIM1, ENABLE);
TIM_Cmd(TIM3, ENABLE); 
    while(1)
  {  }
}



下载进板子就没输出,为什么呢?可以确定管脚没问题,因为单独不变占空比可以有输出的

最佳答案

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

参考下这个:http://www.openedv.com/posts/list/37175.htm
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-20 10:36:34 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-20 23:42:27 | 显示全部楼层
帮顶。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-21 09:44:19 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢谢原子哥,没人遇到这种状况么?
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-21 20:30:34 | 显示全部楼层
回复【3楼】laoguren1122:
---------------------------------
原子哥能不能帮忙分析一下呀,这个问题都快一周了,后面的综合测试没法做了,谢谢!!

1)做过测试单独用T1输出没问题
2)加上T3中断就没有输出
我猜测是不是T1和T3的那部分产生冲突了呢?问题T1,T3一起工作仿真怎么有输出,表明软件没问题;T1单独工作有输出,表明硬件没问题。
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-22 13:57:20 | 显示全部楼层
看了一下,他的程序很全,但还是不能解释我的程序为什么有这样的现象?没找到原因,哪个地方冲突?
是不是在T3定时中断里改变T1的占空比数值,需要停止T1呢?
但那样T1会不会产生脉冲中断现象呢?现在的应用又不允许其中断
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-24 17:05:59 | 显示全部楼层
原子哥帮忙看看吧,我实在没招了哦,问题还没解决
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-25 10:54:36 | 显示全部楼层
仿真和下载的代码区别就是编译器的优化问题上,是不是编译器的代码优化问题呢?
哪位大侠帮忙试验指点一下呀?
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-25 18:16:30 | 显示全部楼层
另外我试了一种做法,在主函数里可以实现PWM输出。
        while(1)
        {  
                delay_ms(10);         
                if(Pulse_Add==0)
                        {         TIM_SetCompare1(TIM1,500+0);
                        TIM_SetCompare2(TIM1,500-0);
                        }
                else
                        {Pulse_Add=Pulse_Add-1;
                    ulse1=500+Pulse_Add;
                    ulse2=500-Pulse_Add;
                        TIM_SetCompare1(TIM1,Pulse1);
                    TIM_SetCompare2(TIM1,Pulse2);
                        }
                 //  TIM_CtrlPWMOutputs(TIM1,ENABLE);
         //  TIM_Cmd(TIM1, ENABLE);  //使能TIM3
          
        }
和用定时器的原理一样的,10ms改变一次占空比,怎么回事呢?用T3定时输出就是没有
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-11-25 18:19:34 | 显示全部楼层
原子哥,能否给我验证一下呢,问题在哪
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-11-25 21:57:08 | 显示全部楼层
回复【10楼】laoguren1122:
---------------------------------
TIM3输出PWM,我们开发板例程就有哦。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-12-6 11:09:35 | 显示全部楼层
不是TIM3输出的问题,单独有输出,但是在TIM3中断中改变TIM1的占空比时有问题,没有输出,哪位可以在原子哥的板子上帮忙测试一下,谢谢
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-12-6 16:44:15 | 显示全部楼层
现在确定一个现象就是只要TIM3中断就没输出,即使中断里的程序屏蔽掉也不行,好像是TIM3的中断与TIM1的PWM输出有冲突。
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-12-8 20:30:18 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
原子大哥,有时间帮验证一下吧,现在确定是进任何中断PWM都不输出,没有中断就输出,但仿真时有没有中断都有输出,蹊跷吧!
在战舰版上测试也是一样的结果,why?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-9 00:47:57 | 显示全部楼层
回复【14楼】laoguren1122:
---------------------------------
不可能
我有时间写代码测试下。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-12-9 18:30:51 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------

谢谢原子哥,拜托了
回复

使用道具 举报

19

主题

85

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
202
金钱
202
注册时间
2014-9-16
在线时间
11 小时
 楼主| 发表于 2014-12-11 19:56:11 | 显示全部楼层
原子哥不用自己写了,我这个程序就是在你的战舰版上修改的。你直接验证就可以了,谢谢

实验9 PWM输出实验-hubu-softstar.zip

223.41 KB, 下载次数: 107

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 02:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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