找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 597|回复: 1
打印 上一主题 下一主题
收起左侧

单片机电机调速程序

[复制链接]
跳转到指定楼层
楼主
ID:1092316 发表于 2024-4-1 17:51 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<stc8g.h>
sbit Key=P3^3;
void Timer_Init(void);          //外部中断初始化
void Key_Check(void);           //按键扫描函数
unsigned int c=0,Alarm1,Alarm;

void delay1us(unsigned int us)
{
    unsigned int i, j;
    for(i = us; i > 0; i--)
        for(j =700; j > 0; j--);  //700
}
void main()  
{   P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0xff;
    P5M1 = 0x00;

        P3PU |= 0x0f;

Timer_Init();       //定时器初始化
  //  Alarm1=200;
while(1)
{
if(P31==1 )
{
P35=1;
P54=1;
delay1us(Alarm1);
P35=0;
P54=0;
delay1us(Alarm);                        
    //  P2=~a;                    
    } }}

void Key_Check(void)
{   
    static unsigned int press_time=0;
    if(Key==0)
        {         //扫描按键1     
        if(++press_time<=0) --press_time;    //计算按键时间,避免数据溢出
        if(press_time==1000)
                {               //按键长按1s时要做的事情                  
         c--;  // LED2=~LED2;         
             } }
                else
            {      
       if((20<=press_time)&&(press_time<1000))
             {         //大于10ms小于1s,短按
            c++;   //LED1=~LED1;//长加不能对调                     
                }
        press_time=0;
      if(        c>8)

      {  
        c=0;
            }
       P1=~c;

          if(c==0)

   { Alarm1=999;
            Alarm=1; }

           if(c==1)
    {
       Alarm1=1000;
            Alarm=3000; }        //不能用200 800


          if(c==2)

   { Alarm1=1500;
            Alarm=4000; }

           if(c==3)
    {
       Alarm1=1500;
            Alarm=5000;
                                   }

         if(c==4)

   { Alarm1=2000;
            Alarm=5000; }

           if(c==5)
    {
       Alarm1=150;
            Alarm=1000;}

        if(c==6)
    {
       Alarm1=200;
            Alarm=1000; }        //16hz

      if(c==7)

   { Alarm1=6000;
            Alarm=1000; }

           if(c==8)                        
   
       {Alarm1=900;        //未加括号,占空比不变,周期变
            Alarm=100;}
                                 
                }}

//定时器初始化
void Timer_Init(void)
  {
    TMOD|=0x10; //打开定时器01,工作方式1。
    TH1=0xfc;   //给定时器0赋初值,定时1ms   
    TL1=0x18;
    ET1=1;      //打开定时器0中断允许
    TR1=1;      //打开定时器
    EA=1;       //打开总中断
          }

void Timer1() interrupt 3
  {
    TH1=0xfc;   //给定时器1赋初值,定时1ms   
    TL1=0x18;
    Key_Check();//按键扫描      
             }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:961114 发表于 2024-4-3 09:50 | 只看该作者
电机控制,STC8H系列的高级PWM 更好吧。
梁工讲解PWM控制电机

无刷电机:带霍尔和不带霍尔。
三相电机用6个半桥驱动,三项有星型连接和三角形连接,常用星型连接。
三相六步电机原理分析。
有霍尔电机的驱动。
无霍尔电机的驱动。
例子讲解。
不带霍尔的电机驱动比带霍尔的复杂。
电机的等效模型:电阻、电感和反电动势串联。驱动的关节在如何检测转子位置。换向时机的选择:30度。
过零检测。检测悬空相的反电动势。
低转速高输出力矩的电机用有霍尔。
高转速高输出力矩的电机用无霍尔。(转速高)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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