OpenEdv-开源电子网

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

pwm PID调速 实时速度无法刷新

[复制链接]

20

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
323
金钱
323
注册时间
2018-1-23
在线时间
40 小时
发表于 2018-7-7 21:33:13 | 显示全部楼层 |阅读模式



SPEED_transform()是实时转速返回函数,但是这个函数只能返回程序刚开始执行的电机速度,仿真发现转速是实时变化的,只是没有返回。

这是主函数
int Real;
int Expect;

int main()
{

        uchar str4[] = "R Rate:      RPM";
        uchar str5[] = "S Rate:      RPM";
       
        KEY_Config();
        PNS_Config();
        delay_init();
        uart_init(9600);
        NVIC_PriorityGroupConfig( NVIC_PriorityGroup_2 );
        TIM3_Config();
        PWM_Config(999,0);
        SPEED_Config(0xffff,0);               
        LCD1602A_CONFUG();
       
        while (1)
        {
                LCD1602_Show_Str(0,1,str5);
                LCD1602_Show_Str(0,0,str4);
                Real = SPEED_transform();
          Expect = KEY_Position();       
                PID_Figure(Real, Expect);
        }
}


这是 SPEED_transform()函数体  没有定义的变量都是全局变量
转速实测 可以实时变化

int SPEED_transform()
{       
        u8 STATE;

       
        if(IN1 ==0 && IN2 ==0)
        {
                val[3] = 0;
                val[2] = 0;
                val[1] = 0;
                val[0] = 0;
                LCD1602_Show_array1(9,1,val);
        }
        if(IN1 ==1 && IN2 == 0)
        {
                STATE =0XFB;
                LCD1602_Dis_OneChar(8,1,0xfb);
        }
        if(IN1 ==0 && IN2 == 1)
        {
                LCD1602_Dis_OneChar(8,1,0xfd);
                STATE =0XFD;
        }
        if(STATE == 0XFD)
        {
                SPEED = -SPEED;
        }
        //delay_ms(100);
       
       
  return SPEED;
       
}



void TIM3_IRQHandler()
{
        if(TIM_GetITStatus(TIM3,TIM_FLAG_Update) )
        {
                CAPTURE_ST = TIM_GetCapture1(TIM4);       
                CAPTURE_VAL =        (int)(60*CAPTURE_ST/334);       
               
                SPEED = CAPTURE_VAL;
               
                val[3] = CAPTURE_VAL%10;
                CAPTURE_VAL/=10;
                val[2] = CAPTURE_VAL%10;
                CAPTURE_VAL/=10;
                val[1] = CAPTURE_VAL%10;
                CAPTURE_VAL/=10;
                val[0] = CAPTURE_VAL%10;
               
                LCD1602_Show_array1(9,1,val);
               
                TIM_SetCounter(TIM4,0);
        }
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);
}






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-15 15:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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