找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3999|回复: 14
收起左侧

让stm32也能像PLC一样 可以使用N多的定时器,从而不影响其他程序的运行

  [复制链接]
ID:285686 发表于 2021-3-24 18:24 | 显示全部楼层 |阅读模式
让stm32 也能像PLC一样 可以使用N多的定时器,从而不影响其他程序的运行;我发现用plc做控制编程很快,用stm32 配置很麻烦。不知道大家有没有同感。一般情况下,我愿意用单片机工控板,用梯形图编程很方便。可是有时候用的地方PLC功能受到限制,在及时性和功能方面不如stm32的开发板好用。所有有的时候还是需要用单片机。为了控制方便,需要用到多个定时的地方,用单片机的定时器很浪费,所以我就做了一个可以定义出来多个软件定时器的办法,经过测试发现定时准确,使用也很方便。
回复

使用道具 举报

ID:285686 发表于 2021-3-24 18:25 | 显示全部楼层
我定义了一个数组:再封装了一个函数,可以向用PLC的定时器一样来使用这个定时器;

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:285686 发表于 2021-3-24 18:27 | 显示全部楼层
我定义了一个软件定时器的机构体,再封装了一个函数。就像使用PLC的定时器一样方便。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:285686 发表于 2021-3-24 18:32 | 显示全部楼层
struct students
{
        int start;
        int Count value;
        int Set value;
        int Time to mark;
}DSQ[3];
回复

使用道具 举报

ID:285686 发表于 2021-3-24 18:33 | 显示全部楼层
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;        
        TIM_TimeBaseStructure.TIM_Prescaler =psc;
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ITConfig(  
                TIM3, //TIM2
                TIM_IT_Update ,
                ENABLE  
                );
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);  

        TIM_Cmd(TIM3, ENABLE);
                                                         
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:285686 发表于 2021-3-24 18:39 | 显示全部楼层
  1. void TIM3_IRQHandler(void)   
  2.    { int i=0;
  3.         if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  4.                 {
  5.                 TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );
  6. //                        LED0=!LED0;
  7.       
  8.                                 for (i=0;i<3;i++)
  9.                                 {
  10.                                                 if (DSQ[i].start==1)
  11.                                                 {
  12.                                                         DSQ[i].Count value++;
  13.                                                                         if(DSQ[i].Count value>=DSQ[i].dingshizhi)
  14.                                                                         {
  15.                                                                         DSQ[i].Time to mark=1;
  16.                                                                                 DSQ[i].Count value=0;
  17.                                                                         }
  18.                                                 }
  19.                                         }        



  20. }

  21. }
复制代码
回复

使用道具 举报

ID:285686 发表于 2021-3-24 19:05 | 显示全部楼层
DSQ[1].Time to mark=0;
DSQ[1].start=1;

"DSQ[1].Count value=77;//77毫秒,随意定时
   
      if (DSQ[1].Time to mark==1)
      {
       LED0=1;
        DSQ[1].start=0;

      }
      
      else LED0=0;"
回复

使用道具 举报

ID:592807 发表于 2021-3-25 08:44 | 显示全部楼层
硬汉的教程里面有这种功能。用滴答计时器做的,每隔1ms计入中断一次。在中断里面将所有的计数器加1,当计数器数值等于预装值时就将定时器达到标志位置1.如果是一次性的模式就在这里结束函数,如果不是一次性的那就将计数器归零重新开始。

定义一个结构体/* 定时器结构体,成员变量必须是 volatile, 否则C编译器优化时可能有问题 */
typedef struct
{
        volatile uint8_t Mode;                /* 计数器模式,0 1次性   1 自动重装*/
        volatile uint8_t Flag;                /* 定时到达标志  */
        volatile uint32_t Count;        /* 计数器 */
        volatile uint32_t PreLoad;        /* 计数器预装值 */
}SOFT_TMR;




评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:367934 发表于 2021-3-25 09:09 | 显示全部楼层
使用OS 创建任务更灵活。
回复

使用道具 举报

ID:695741 发表于 2021-3-25 10:21 | 显示全部楼层
要是能把工程文件打包出来就更好了
回复

使用道具 举报

ID:781556 发表于 2021-3-25 10:59 | 显示全部楼层
是時候考慮上手RTOS了
回复

使用道具 举报

ID:285686 发表于 2021-3-25 18:56 | 显示全部楼层
@ 黄youhui 。硬汉的教程里面有这种功能。我去看看。
回复

使用道具 举报

ID:285686 发表于 2021-3-26 20:16 | 显示全部楼层
正点原子教的是UCOS II
回复

使用道具 举报

ID:304608 发表于 2021-3-28 16:06 | 显示全部楼层
操作系统就是这个思想哇。。
回复

使用道具 举报

ID:879348 发表于 2021-3-29 08:23 | 显示全部楼层
操作系统虚拟定时器
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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