OpenEdv-开源电子网

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

PWM输出无法实现循环,思良久,不得结果,遂贴出求各位朋友批评指导,愿听其详,谢谢!

[复制链接]

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
发表于 2013-6-17 23:05:44 | 显示全部楼层 |阅读模式

1.程序是在原子老大的 PWM输出实验基础上修改的
2.程序修改后目的:通过按键KEY0控制DS0,按键按下不松,DS0(LED灯)不断逐渐亮、逐渐灭循环。
3.问题描述:经自己修改,也能实现上面的目的。但是之前,while(t==1)处的while改为if后,程序便只能循环一次。
自己在调试模式下,一步步执行(也有跳过),但是最后都在while(1)里面反复执行,按照这个道理那if也能实现目的啊,但是结果不行,
愿听各位的批评,指导。致谢!
 int main(void)
{  
  u16 led0pwmval=0;
// u8 dir=1,t,i,j; 
    u16 i;
 u16 j;
 u8 t;
  Stm32_Clock_Init(9); //系统时钟设置
 delay_init(72);      //延时初始化
 uart_init(72,9600);  //串口初始化
 LED_Init();      //初始化与LED连接的硬件接口
 WM_Init(900,0);  //不分频。PWM频率=72000/900=8Khz
    while(1)
 {
 
  t=KEY_Scan();
  while(t==1)                //之前我这里是if,结果:LED灯只能循环亮灭一次。然后不亮了。 ?????
  {
    for(i=0;i<300;i++)      //KEY0按下刚开始PWM输出自增,增大到300后又自减
    { 
      led0pwmval=i;
      LED0_PWM_VAL=led0pwmval;//PWM输出自增
      delay_ms(10);
    
    }  
    if(i==300)
      {
     for(i=300;i>0;i--)
       {
          led0pwmval=i;
          LED0_PWM_VAL=led0pwmval;//PWM输出自减
          delay_ms(10) ;
       }
   }
  }
  else
  {
    led0pwmval=0;
    LED0_PWM_VAL=led0pwmval;
  }; 
 /* if(dir)led0pwmval++;
  else led0pwmval--;

   if(led0pwmval>300)dir=0;
  if(led0pwmval==0)dir=1; 
            
  LED0_PWM_VAL=led0pwmval;  */ 
 } 

等待就是浪费时间!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 00:21:37 | 显示全部楼层
汗,等到凌晨 还是无人能回答。原子哥,貌似问题出在KEY_SCAN吧。感觉第二次key_scan得不到1,所以return也没有1,所以只有0.所以只有一次,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!我要睡了,啊啊啊啊啊啊啊啊啊啊啊啊啊
等待就是浪费时间!
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 00:22:22 | 显示全部楼层
自问自答,估计晚上又要说梦话了!!!啊啊啊啊啊啊啊啊啊!
等待就是浪费时间!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-6-18 00:27:51 | 显示全部楼层
回复【楼主位】dianzi430:
---------------------------------
我们的按键扫描程序,有防止一次按下多次触发的设计哦!!
你看看是不是这个问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 00:38:19 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子老大,看完这个,我彻底明白了,http://www.cnblogs.com/dongzhiquan/archive/2009/07/21/1994792.html
static key_up=1;中的static定义了以后,虽然第二次竟然key_scan这个函数,但是key_up仍然为0,没有释放,所以后面只有return0了。 这个在KEY_SCAN 里面。 哟西,感谢网上给我指点的朋友。不知道对不对,谢谢! 对了 老大,你的防一次多次触发我待会去查一下,没有听过。
等待就是浪费时间!
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 00:44:02 | 显示全部楼层

贴出原子老大的宝贝代码:方便大家查阅,不然不知道我在念什么经
//按键处理函数
//返回按键值
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY2按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2!!
u8 KEY_Scan(void)

 static u8 key_up=1;//按键按松开标志 //这个static去掉以后一切按目的进行。因为每次进入KEY_SCAN这个函数后,并没有释放上一次的key_up=0;所以后面的第一个if无法进入咯
 JTAG_Set(JTAG_SWD_DISABLE);
 if(key_up&&(KEY0==0||KEY1==0||KEY2==1))
 {
  delay_ms(10);//去抖动
  key_up=0;
  if(KEY0==0)
  {
   JTAG_Set(SWD_ENABLE);
   return 1;
  }
  else if(KEY1==0)
  {
   JTAG_Set(SWD_ENABLE);
   return 2;
  }
  else if(KEY2==1)
  {
   JTAG_Set(SWD_ENABLE);
   return 3;
  }
 }else if(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;     
 JTAG_Set(SWD_ENABLE);
 return 0;// 无按键按下
}

 

等待就是浪费时间!
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 08:42:00 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子哥,早上上班第一时间回复,我对“防一次按下多次触发”的理解:是不是通过那个static实现的,原因就是上面我回复的。
等待就是浪费时间!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2013-6-18
在线时间
0 小时
发表于 2013-6-18 08:57:47 | 显示全部楼层
回复【楼主位】dianzi430:
---------------------------------
回复【楼主位】dianzi430:
---------------------------------
加一句话就可以循环了,
t=KEY_Scan;
if(t==1)a=1;
while(a==1);
后面不变试试行吗
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-18 10:40:32 | 显示全部楼层
楼主你读文科的吧= =,
 key=KEY_Scan(1);
if(key)
{
if(x)
{
led0pwmval++;if(led0pwmval>=300) x=0;
}
if(!x)
{
led0pwmval--;if(led0pwmval<=0) x=1;
}
 LED0_PWM_VAL=led0pwmval;
delay_ms(10);
}
else delay_ms(100);
一直努力就很好。
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-18 10:41:16 | 显示全部楼层
帮你小写了一个,你可以参考参考。
一直努力就很好。
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 22:37:24 | 显示全部楼层
回复【8楼】lky:
---------------------------------
谢谢,你这样意义不大,还不如直接用while .
等待就是浪费时间!
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-18 22:38:42 | 显示全部楼层
回复【10楼】qq942266575:
---------------------------------
谢谢你的冷水,你的代码却是很好,原创?长知识了,我是理科,让您见笑了。
等待就是浪费时间!
回复 支持 反对

使用道具 举报

4

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2013-3-21
在线时间
0 小时
 楼主| 发表于 2013-6-19 11:06:40 | 显示全部楼层
回复【10楼】qq942266575:
---------------------------------
把你的代码用上后,又出现LED灯只循环逐渐亮,灭一次。正在思考……
等待就是浪费时间!
回复 支持 反对

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2013-6-19 11:48:41 | 显示全部楼层
没有,看你文笔不错,
原创,你思考一下。应该是没问题的。我没试过。
一直努力就很好。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-18 14:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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