亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 774|回復: 5
收起左側

PWM控制電機轉速 為什么我的程序控制不了?

[復制鏈接]
ID:1167562 發表于 2026-3-9 21:09 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
sbit onn=P1^0;
sbit seet=P1^1;
sbit addd=P1^2;
sbit subb=P1^3;
sbit gass=P1^4;
sbit breakk=P1^5;
sbit IN1=P1^6;
sbit IN2=P1^7;
sbit ENA=P2^0;

//占空比,最大占空比
unsigned char ZKB,high=0,on=0,set=0,add=0,sub=0,sc=0,duty_zkb=0,ZKBB=0,cnt=0;


void Motor_Auto_add();
void Time0_Init(void);
void key_process(unsigned char key_num);
void key_scan();

void Time0_Init(void)
{
        TMOD=0X01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=ET0=1;
        TR0=1;
}

void main()
{        IN1=1;
        IN2=0;
        Motor_Auto_add();
        Time0_Init();
        //key_process(unsigned char key_num);
        while(1)
        {               
               
                key_scan();
               
        }
}


//按鍵掃描
void key_scan()
{
        int i=0;
        //開始建,自增速
        if(onn==0)
                for(i=0;i<200;i++);
                if(onn==0)
                {
                        on=1;//開始標志
                        while(onn==1);
                }
        if(seet==0)
                for(i=0;i<200;i++);
                if(seet==0)
                {
                        set=1;//巡航開始標志
                        duty_zkb=high;//將當前占空比保留
                        while(seet==1);
                }
        if(addd==0)
                for(i=0;i<200;i++);
                if(addd==0)
                {
                        add=1;//加速鍵標志位
                        while(addd==1);
                }
        if(subb==0)
                for(i=0;i<200;i++);
                if(subb==0)
                {
                        sub=1;//減速標志位
                        while(subb==1);
                }
}

//終端按鍵掃描執行程序
void key_process(unsigned char key_num)
{
        switch(key_num)
        {
                case 1:
                        high=0;
                        set=0;
                        break;
                case 2:
                        high=0;
                        set=0;
                        break;
                default:
                        break;
        }
}

//電機調速
void Motor_Auto_add()
{
        if(on==1)
        {
                high++;
                high%=100;
        }
        //else
        //{
        //ZKB=0;
        //}
        
        if(set==1)
        {
                high=duty_zkb;
        }
        else if(set==0)
        {high=0;}
        
        if(set==1&&add==1)
        {
                high=high+1;
                if(high==100)
                add=0;
        }
        if(set==1&&sub==1)
        {
                high=high-1;
                if(high<0)
                sub=0;
        }
}



//中斷優先
void int0_srv() interrupt 0
{int i=0;
        for(i=0;i<200;i++);
                if(breakk==0)
                {
                        key_process(1);
                        while(breakk==1);
                }
                else if(gass==0)
                {
                        key_process(2);
                        while(gass==1);
                }
}

void time0_srv() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        cnt++;
        cnt%=100;
        if(cnt<high)
        {
                ENA=1;
        }
        else
        {
                ENA=0;
        }
}

我想實現按鍵控制電機轉速,當按鍵按下時可以保持當前車速,再有按鍵按下時實現加速或者減速,為什么我的程序控制不了啊????
回復

使用道具 舉報

ID:844772 發表于 2026-3-10 09:54 | 顯示全部樓層
錯太多了,直說一個吧,將Motor_Auto_add()放入主循環中調用。另外,你調速邏輯不對,但好歹放進去能略微抖動一下。
回復

使用道具 舉報

ID:584814 發表于 2026-3-10 11:00 | 顯示全部樓層
二樓言簡意該。可以AI找方案。
回復

使用道具 舉報

ID:1074206 發表于 2026-3-10 12:33 來自觸屏版 | 顯示全部樓層
把程序copy給ai,然后提問,你會發現新大陸
回復

使用道具 舉報

ID:1167562 發表于 2026-3-11 15:46 | 顯示全部樓層
參考各位的意見了,讓AI查問題改正后,還是無法實現速度保持。
PWM速度保持到底怎么實現啊?

這是改正后的程序
#include <reg52.h>
sbit onn=P1^0;
sbit seet=P1^1;
sbit addd=P1^2;
sbit subb=P1^3;
sbit gass=P1^4;
sbit breakk=P1^5;
sbit IN1=P1^6;
sbit IN2=P1^7;
sbit ENA=P2^0;

//占空比,最大占空比
unsigned char ZKB,on=0,set=0,add=0,sub=0,duty_zkb=0,cnt=0;
unsigned char high=0;
unsigned int j=0;

void Motor_Auto_add();
void Time0_Init(void);
void key_process(unsigned char key_num);
void key_scan();
void Int0_Init(void);
       
void Int0_Init(void)
{
        IT0=1;//下降沿觸發
        EX0=1;// 使能外部中斷0
        EA=1;// 開總中斷
}
void Time0_Init(void)
{
        TMOD=0X01;//定時器0工作模式1(16位定時器)
        TH0=(65536-1000)/256;// 1ms定時初值(12MHz晶振)
        TL0=(65536-1000)%256;
        ET0=1;   // 使能定時器0中斷
        TR0=1;// 啟動定時器0
}

void main()
{        IN1=1;// 電機正轉方向
        IN2=0;
       
        Int0_Init();//初始化外部中斷0
        Time0_Init();//初始化定時器0

        while(1)
        {               
               
                key_scan();
                Motor_Auto_add();// 電機調速邏輯
        }
}


//按鍵掃描
void key_scan()
{
unsigned int i=0;
        //開始建,自增速
        if(onn==0)
        {
                for(i=0;i<200;i++);
                if(onn==0)
                {
                        on=!on;//開始標志
                        while(onn==0);
                }
        }
        if(seet==0)
        {
                for(i=0;i<200;i++);
                if(seet==0)
                {
                        set=!set;//巡航開始標志
                        if(set)
                        {duty_zkb=high;//將當前占空比保留
                        }

                        while(seet==0);
                }
        }
        if(addd==0)
        {
                for(i=0;i<200;i++);
                if(addd==0)
                {
                        add=1;//加速鍵標志位
                        while(addd==0);
                }
        }
        if(subb==0)
        {for(i=0;i<200;i++);
                if(subb==0)
                {
                        sub=1;//減速標志位
                        while(subb==0);
                }
        }
}

//終端按鍵掃描執行程序
void key_process(unsigned char key_num)
{
        switch(key_num)                //電機停轉
        {
                case 1:
                        high=0;
                        duty_zkb=0;
                        set=0;
                        on=0;
                        IN1=1;
                        IN2=1;
                        break;
                case 2:
                       
                        on=1;
                        break;
                default:
                        break;
        }
}

//電機調速
void Motor_Auto_add()
{
        if(on==1 && !set)
        {
                j++;
                if(j>=50)//每50ms增加1%占空比
                {
                                j=0;
                                if(high<100)
                                high++;
                }
        }
       
       
        if(on==1 && set==1)
        {
               
                high=duty_zkb;
                //巡航加速
                if(add==1)
                {
                        if(duty_zkb<100)
                                duty_zkb++;
                        add=0;//清除標志位
                }
                if(sub==1)
                {
                        if(duty_zkb>0)
                                duty_zkb--;
                        sub=0;
                }
        }

       
        //未啟動,占空比清零
        if(on==0)
        {
                high=0;
                j=0;
        }
}



//中斷優先(剎車/油門)
void int0_srv() interrupt 0
{int i=0;
        for(i=0;i<200;i++);
                if(breakk==0)
                {
                        key_process(1);
                        while(breakk==0);
                }
                else if(gass==0)
                {
                        key_process(2);
                        while(gass==0);
                }
}

//定時器中斷生成PWM
void time0_srv() interrupt 1
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        cnt++;
        cnt%=100;
        if(cnt<high)
        {
                ENA=1;
        }
        else
        {
                ENA=0;
        }
}


回復

使用道具 舉報

ID:857072 發表于 2026-3-11 20:47 來自觸屏版 | 顯示全部樓層
我用AI幫你問了一下。#include <reg52.h>  // 引腳定義 sbit onn = P1^0;     // 啟動/停止 sbit seet = P1^1;    // 巡航/保持 sbit addd = P1^2;    // 加速 sbit subb = P1^3;    // 減速 sbit gass = P1^4;    // 油門(備用) sbit breakk = P1^5;  // 緊急剎車 sbit IN1 = P1^6;     // 電機方向1 sbit IN2 = P1^7;     // 電機方向2 sbit ENA = P2^0;     // PWM 輸出  // 全局變量 unsigned char high = 0;        // 當前占空比 (0-100) unsigned char duty_zkb = 0;    // 巡航保存的基準速度 bit on = 0;                    // 運行標志 (1=運行, 0=停止) bit set = 0;                   // 巡航標志 (1=巡航, 0=非巡航) bit add = 0;                   // 加速標志 (1=等待處理) bit sub = 0;                   // 減速標志 (1=等待處理) unsigned int j = 0;            // 自動增速計時器  // 函數聲明 void Time0_Init(void); void key_scan(void); void Motor_Auto_add(void); void int0_srv(void) interrupt 0;  void Time0_Init(void) {     TMOD = 0x01;                 // 定時器0工作模式1 (16位定時器)     TH0 = (65536 - 1000) / 256;  // 1ms定時初值 (12MHz晶振)     TL0 = (65536 - 1000) % 256;     ET0 = 1;                     // 使能定時器0中斷     TR0 = 1;                     // 啟動定時器0 }  void main() {     IN1 = 1;  // 電機正轉     IN2 = 0;          Time0_Init();  // 初始化定時器          while (1) {         key_scan();     // 按鍵掃描         Motor_Auto_add(); // 電機調速     } }  // 按鍵掃描 (帶消抖) void key_scan() {     unsigned int i;          // 啟動/停止鍵 (onn)     if (onn == 0) {         for (i = 0; i < 200; i++);  // 消抖         if (onn == 0) {             on = !on;  // 切換運行狀態             while (onn == 0);  // 等待按鍵釋放         }     }          // 巡航鍵 (seet)     if (seet == 0) {         for (i = 0; i < 200; i++);         if (seet == 0) {             set = !set;  // 切換巡航模式             if (set) duty_zkb = high;  // 保存當前速度             while (seet == 0);         }     }          // 加速鍵 (addd) - 按下一次只觸發一次     if (addd == 0) {         for (i = 0; i < 200; i++);         if (addd == 0) {             add = 1;  // 標記加速             while (addd == 0);         }     }          // 減速鍵 (subb) - 按下一次只觸發一次     if (subb == 0) {         for (i = 0; i < 200; i++);         if (subb == 0) {             sub = 1;  // 標記減速             while (subb == 0);         }     } }  // 電機調速核心邏輯 (關鍵修正) void Motor_Auto_add() {     // 巡航模式下:先處理加速/減速,再更新速度     if (set) {         // 1. 處理加速 (修改基準速度)         if (add) {             if (duty_zkb < 100) duty_zkb++;             add = 0;  // 立即清零標志位         }         // 2. 處理減速 (修改基準速度)         if (sub) {             if (duty_zkb > 0) duty_zkb--;             sub = 0;  // 立即清零標志位         }         // 3. 將當前速度更新為最新基準         high = duty_zkb;     }     // 非巡航模式:速度由按鍵控制 (無自動增速)     else {         if (on) {             // 速度保持為0,直到按下加速鍵             // (原自動增速邏輯已移除,避免失控)         } else {             high = 0;  // 未運行時速度清零         }     } }  // 外部中斷0 (緊急剎車/油門) void int0_srv() interrupt 0 {     if (breakk == 0) {  // 緊急剎車         on = 0;         set = 0;         high = 0;         duty_zkb = 0;         while (breakk == 0);  // 等待釋放     }     else if (gass == 0) {  // 油門啟動         on = 1;         while (gass == 0);     } }  // 定時器0中斷 (PWM生成) void time0_srv() interrupt 1 {     TH0 = (65536 - 1000) / 256;  // 1ms定時     TL0 = (65536 - 1000) % 256;     static unsigned char cnt = 0;     cnt++;     if (cnt >= 100) cnt = 0;  // 100ms周期 (100Hz PWM)          if (cnt < high) {         ENA = 1;  // 占空比內輸出高     } else {         ENA = 0;  // 占空比外輸出低     } }
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表