久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2442|回復: 6
收起左側

51單片機用中斷做pwm調速,老是在2V左右有大哥給看看嗎

[復制鏈接]
ID:344179 發表于 2019-2-27 11:20 | 顯示全部樓層 |閱讀模式
51單片機用中斷做pwm調速,占空比從0-100逐漸增大,但是程序輸出端口老是在2V左右上不去,有大哥給看看嗎具體問題在中斷1,
這是一個藍牙小車程序


#include <reg52.h>

sbit EN1 = P2^0; //為1 右電機使能
sbit EN2 = P2^1; //為1 左電機使能
sbit IN1 = P2^2; //為1 右電機反轉
sbit IN2 = P2^3; //為1 右電機正轉
sbit IN3 = P2^4; //為1 左電機正轉
sbit IN4 = P2^5; //為1 左電機反轉

#define left_motor_en           EN1 = 1           //左電機使能
#define left_motor_stops        EN1 = 0           //左電機停止
#define right_motor_en          EN2 = 1           //右電機使能
#define right_motor_stops       EN2 = 0           //右電機停止
#define left_motor_go           IN1 = 0, IN2 = 1  //左電機正傳
#define left_motor_back         IN1 = 1, IN2 = 0  //左電機反轉
#define right_motor_go          IN3 = 1, IN4 = 0  //右電機正傳
#define right_motor_back        IN3 = 0, IN4 = 1  //右電機反轉

double count = 0;//定義占空比,并初始占空比為26%
unsigned char time;
unsigned char pwm_left_val = 255;//左電機占空比值 取值范圍0-170,0最快
unsigned char pwm_right_val = 255;//右電機占空比值取值范圍0-170 ,0最快
unsigned char pwm_t = 0; //周期

void UART_INIT();  //藍牙接收初始化
void Che_init();   //小車輸出端口定時器初始化
void forward();    //小車前進
void back();       //小車后退
void right();      //小車左轉
void left();       //小車右轉
void stop();           //小車停止
void delay(unsigned int z);        //延時函數
               
void main()
{
        UART_INIT();  //藍牙接收初始化
    Che_init();          //小車輸出端口定時器初始化
    while(1);
}

void UART_INIT()  //藍牙接收初始化
{
        SCON = 0X50;
    TMOD = 0x20; //8位自動重裝模式
    TH1 = 0xfd;
    TL1 = 0xfd;  //9600波特率
    TR1 = 1;     //啟動定時器1
    ES = 1;      //開串口中斷
        EA = 1;      //開總中斷
}
                        
void Che_init()         //小車使能輸出端口定時器初始化
{

        TMOD|= 0x02; //8位自動重裝模塊
    TH0 = 0xdc;
    TL0 = 0xdc;    //11.0592M晶振下占空比最大比值是256,輸出100HZ
    TR0 = 1;      //啟動定時器0
    ET0 = 1;      //允許定時器0中斷
    EA = 1;       //總中斷允許
}

void forward()        //小車前進
{
        ET0 = 1;
        TR0 = 1;
    left_motor_go;  //左電機前進
    right_motor_go; //右電機前進
}

void back()        //小車后退
{
        ET0 = 1;
        TR0 = 1;
        left_motor_back;  //左電機反轉
        right_motor_back; //右電機反轉      
}

void right()  //小車左轉
{
        ET0 = 1;
        TR0 = 1;
        left_motor_go;    //左電機正傳
        right_motor_back; //右電機反轉
}

void left()          //小車右轉
{
        ET0 = 1;
        TR0 = 1;
        right_motor_go;         //右電機正傳
        left_motor_back; //左電機反轉
}

void stop()          //小車停止
{
        ET0 = 0;
        TR0 = 0;
        count = 0;
        left_motor_stops;   //左電機停止
        right_motor_stops;        //右電機停止
}

void timer0() interrupt 1  //定時器0中斷
{
        pwm_t++;
        pwm_left_val--;
        if(pwm_left_val <= pwm_t)
                EN1 = 1;
        else
                EN1 = 0;
        if(pwm_t == 255)
                pwm_t = 0;
/*       
        pwm_t++;
//        pwm_left_val--;
//        pwm_right_val--;
        if(pwm_t == 255)
        {
           EN1 = 0;
           EN2 = 0;
           pwm_t = 255;
        }  
        if(pwm_left_val ==         pwm_t)
            EN1 = 1;
        if(pwm_right_val == pwm_t)
                EN2 = 1;*/                        
}

void UART_SER() interrupt 4  //串口中斷
{
        if(RI)
    {
            RI = 0;//清除接收標志
        switch(SBUF)
        {
                case 'a':          //前進
                                forward();
                                break;
            case 'b':          //后退
                                back();
                                break;
            case 'l':          //左轉
                                right();
                                break;
                        case 'r':          //右轉
                                left();
                                break;
            case 's':          //停止
                                stop();
                                break;
                        default:     //否則全部停止
                                stop();
                                break;
        }
     }
}

void delay(unsigned int z)
{
        unsigned int x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);
}


回復

使用道具 舉報

ID:382826 發表于 2019-2-27 11:46 | 顯示全部樓層
把IO口設置成推挽模式試一下
回復

使用道具 舉報

ID:443888 發表于 2019-3-1 11:02 | 顯示全部樓層
能問下你藍牙功能是直接用的現成的藍牙模塊嗎?
回復

使用道具 舉報

ID:450228 發表于 2019-3-3 15:22 | 顯示全部樓層
想問一下,那個電機使能對應的I/O口是連接著驅動模塊的總開關那個地方嗎
回復

使用道具 舉報

ID:484029 發表于 2019-3-4 09:21 | 顯示全部樓層
十六位自動重載模式  TMOD|=0x01  ,1T的工作模式,設定為100us,頻率可達1khz。調占空比即可,實測精度很高
回復

使用道具 舉報

ID:466164 發表于 2019-3-4 22:50 | 顯示全部樓層
從你程序里沒發現DA芯片,也沒說有有運放跟隨電壓輸出電路,單pwm效果不理想正常。不太懂回答可能不理想。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 少妇精品亚洲一区二区成人 | 蜜桃免费av| 国产精品1区2区3区 男女啪啪高潮无遮挡免费动态 | 九九热精品免费 | 亚洲国产免费 | 免费观看日韩精品 | 99热国产在线播放 | 国产欧美日韩精品一区二区三区 | 国产高清在线视频 | www.国产.com | 中文天堂在线观看 | 色婷婷精品国产一区二区三区 | 久久精品国产清自在天天线 | av免费观看网站 | 成人高清视频在线观看 | 四虎精品在线 | av在线免费观看网站 | 国产成人精品午夜视频免费 | 一区二区三区四区在线视频 | 久久伊人免费视频 | 一区二区三区成人 | 国产精品毛片一区二区三区 | 国产在线精品一区二区三区 | 天堂久久av | 国产一区二区三区在线视频 | 玖玖在线免费视频 | 天天宗合网| 日韩一二三 | 日韩免费看片 | 亚洲成人一区 | 亚洲精品二区 | 国产成人一区二区三区 | 91精品国产91久久久久久密臀 | 亚洲经典一区 | 6996成人影院网在线播放 | 99热视| 色爱综合 | 国产精品午夜电影 | 国产午夜精品一区二区三区 | 日韩免费一区二区 | 欧美日韩专区 |