OpenEdv-开源电子网

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

PID算法PWM输出结束后,强制将PWM输出引脚拉高并延时一段时间后关闭

[复制链接]

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-8
在线时间
6 小时
发表于 2021-1-25 11:44:54 | 显示全部楼层 |阅读模式
18金钱
本帖最后由 soloadios 于 2021-1-25 12:23 编辑

为了解决这个问题,把仅有的18金钱全部作为悬赏,虽然少了点,但态度可表

求助问题描述:PID运算结束后,通过TIM_CCxCmd函数Disable定时器4的通道3和通道4,现在想实现的功能是:把通道3强制拉高(通道3驱动的执行器为DC24V高电平打开,0关闭)并延时2s后关闭,下次运算时PWM功能还能继续正常使用,如此循环。可用的定时器:
TIM2_Init(100-1,(640-1)*1);//0.001s==1ms
TIM3_Int_Init(10-1,640-1);//0.0001s==0.1ms


代码如下:
pwm_out=(float)PID_Calculation(structpid, (control*400), (collection*400))/(float)1;       
if(pwm_out>0)  //控制值大于采集值
        {
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);
                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
                TIM_SetCompare4(TIM4,pwm_out);
        }
        else if(pwm_out<0)  //控制值小于采集值
        {
                pwm_out=-pwm_out;
                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);
                TIM_SetCompare3(TIM4,pwm_out);


        }else  //控制值等于采集值
        {
                TIM_SetCompare4(TIM4,pwm_out);
                TIM_SetCompare3(TIM4,pwm_out);
                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);
        }




最佳答案

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

方法1:加标志 if(Time_PQ
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8632
金钱
8632
注册时间
2020-5-11
在线时间
4073 小时
发表于 2021-1-25 11:44:55 | 显示全部楼层
soloadios 发表于 2021-1-25 18:12
我现在加了一段代码如下:

else

方法1:加标志
if(Time_PQ<=......
{
if(flag==0)
{
  flag=1;
  TIM_SetCompare3......
}
}
方法2:读取TIM_CCx_Enable位,加以判断.

专治疑难杂症
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-8
在线时间
6 小时
 楼主| 发表于 2021-1-25 16:03:13 | 显示全部楼层
哪位大神不吝赐教,最好能贴上代码,在线等
回复

使用道具 举报

12

主题

3387

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8632
金钱
8632
注册时间
2020-5-11
在线时间
4073 小时
发表于 2021-1-25 16:24:48 | 显示全部楼层
也许没必要关闭PWM,通过修改比较值也可实现输出脚的置高或置低。
傲游截图20210125162201.jpg
专治疑难杂症
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-8
在线时间
6 小时
 楼主| 发表于 2021-1-25 18:12:21 | 显示全部楼层
LcwSwust 发表于 2021-1-25 16:24
也许没必要关闭PWM,通过修改比较值也可实现输出脚的置高或置低。

我现在加了一段代码如下:

else
        {
                TIM_SetCompare4(TIM4,pwm_out);
//                TIM_SetCompare3(TIM4,pwm_out);
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);
//                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
               
                if(Time_PQ<=20 && pwm_out==0 && control<=0.0025)    //Time_PQ为定时器做的延时,时间为2s
                {
                        TIM_SetCompare3(TIM4,3500);
                        TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);
                }
                else{
                        TIM_SetCompare3(TIM4,pwm_out);
                        TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
                }
        }

已经可以实现了这个功能,但是带来一个问题就是:TIM4的ch3每隔2s会动作一次,想要实现的是当pwm_out=0的时候,这个if语句里面只执行一次。不知道该加什么约束条件实现,望大神指点。
回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-8
在线时间
6 小时
 楼主| 发表于 2021-1-25 20:58:23 | 显示全部楼层
LcwSwust 发表于 2021-1-25 18:21
方法1:加标志
if(Time_PQ

非常感谢,终于搞定,测试了很多次,没有bug出现,功能符合要求,这18分就给您了,虽然有点少,但是由衷的感谢!

附上代码:

if(pwm_out>0)//控制值大于采集值
        {       
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Enable);       
                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
                TIM_SetCompare4(TIM4,pwm_out);
                JxPq_flag=0;
        }
        else if(pwm_out<0)//控制值小于采集值
        {
                pwm_out=-pwm_out;       
                TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);
                TIM_SetCompare3(TIM4,pwm_out);//(int)((float)pwm_out/(float)1));
        }else //控制值等于采集值
        {
               
                TIM_SetCompare4(TIM4,pwm_out);
                TIM_CCxCmd(TIM4,TIM_Channel_4,TIM_CCx_Disable);
               
        if(Time_PQ<=10&& control<=0.0125)
                {
                        if(JxPq_flag==0)
                        {
                        TIM_SetCompare3(TIM4,3500);  //3500′óóúPWMμ&#196;&#212;¤×°&#212;&#216;&#214;μ£&#172WM3£ê&#228;3&#246;&#184;&#223;μ&#231;&#198;&#189;
                        TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Enable);
                        if(TIM_CCx_Enable) JxPq_flag=1;
                        }
        }else
                {
                        TIM_SetCompare3(TIM4,pwm_out);
                        TIM_CCxCmd(TIM4,TIM_Channel_3,TIM_CCx_Disable);
                }
                       
        }
       
        }

回复

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2020-6-8
在线时间
6 小时
 楼主| 发表于 2021-1-25 21:26:00 | 显示全部楼层
LcwSwust 发表于 2021-1-25 11:44
方法1:加标志
if(Time_PQ

发现一个问题,那个强制延时拉高的程序会偶尔进不去,大神帮忙看看,
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-15 00:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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