基于单片机的直流电机PWM调速设计

发布者:HappyExplorer最新更新时间:2020-09-10 来源: 51hei关键字:单片机  直流电机  PWM调速 手机看文章 扫描二维码
随时随地手机看文章

电机pwm调速程序

/****************************************************


      =========  直流电机控制+速度显示  ==========


****************************************************/


#include                                 //头文件

#define uchar unsigned char                 //宏定义

#define uint unsigned int

#define CYCLE 10                                 //定义PWM的周期T为10ms

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff,0xc6,0x88};//0-9 R 共阳数码管段选数据

/***************************************************

           端口定义

***************************************************/

sbit PWM1=P1^4;                                        //PWM输出口1(电机正转)

sbit PWM2=P1^5;                                        //PWM输出口2(电机反转)

sbit K1=P1^1;                                        //加速

sbit K2=P1^2;                                        //减速

sbit K3=P1^3;                                        //正反转

sbit K4=P1^0;                                        //启动停止

/***************************************************/

uchar PWM_ON=0;                                        //PWM高电平时间

uchar count=0;                                          //中断计时

uchar num=0;

uchar num1=0;                           //中断时间计数

uint num2=0;                                   //外部中断次数

uchar flat=0;                                        //正反转标示位

uchar flag=0;                           //刷新数据标示位

sbit w0=P2^0;

sbit w1=P2^1;

sbit w2=P2^2;

sbit w3=P2^3;


/***************************************************

                函数名称:延时子函数

            函数功能:按键消抖

***************************************************/

void delayms(uint xms)

{

        uint i,j;

        for(i=xms;i>0;i--)

                for(j=110;j>0;j--);

}

/***************************************************

           函数名称:按键子函数

           函数功能:

***************************************************/

void key()

{

        if(K4==0)                                        //启动 停止

        {

                delayms(5);

                if(K4==0)

                {

                        while(!K4);

                     num=!num;

                }

        }

        if(K1==0)                                        //加速键

        {

                delayms(5);

                if(K1==0)

                {

                        while(!K1);

                        if(num<3)

                        num++;

                }

        }


        if(K2==0)                                        //减速键

        {

                delayms(5);

                if(K2==0)

                {

                        while(!K2);

                        if(num>0)

                        num--;

                }

        }


        if(K3==0)                                   //电机正反转按键

        {

                delayms(5);

                if(K3==0)

                {

                        while(!K3);

                        flat++;

                        if(flat==2)

                        flat=0;

                }

        }



        switch(num)

        {

                case 0: PWM_ON=0;  break;        //占空比为00%

                case 1: PWM_ON=4;  break;        //占空比为40%


                case 2: PWM_ON=7;  break;        //占空比为70%


                case 3: PWM_ON=10;  break;        //占空比为100%

                default:

                break;

        }

}

/*******速度数据采集*****************************************/

void sudu()

{

        uint shuju;

        if(flag==1)

        {

                flag=0;

                shuju=num2*2;                         //电机一秒转的圈数               

                num2=0;

        }

        if(flat==0)

        P0=table[11];                //"C"

        else

        P0=table[12];                //"A"

        w0=1;

        delayms(10);

        w0=0;


//        delayms(3);


//        P2=0xfd;


        P0=table[shuju/100];

         w1=1;

        delayms(10);

        w1=0;

//        delayms(3);


//        P2=0xfb;


        P0=table[shuju%100/10];

           w2=1;

        delayms(10);

        w2=0;

//        delayms(3);


//        P2=0xf7;

        P0=table[shuju%10];

//        delayms(3);

        w3=1;

        delayms(10);

        w3=0;

        P2=0xff;

}

void  init()

{

        PWM1=1;                                 //初始化

        PWM2=1;

        TMOD=0x11;                          //打开定时器

        TH0=(65536-50000)/256;

        TL0=(65536-50000)%256;

        ET0=1;

        TR0=1;

        EX0=1;

        IT0=1;

        TH1=(65536-1000)/256;

        TL1=(65536-1000)%256;

        EA=1;

        ET1=1;

        TR1=1;


}

/**************************************************

           函数名称:主函数

           函数功能:

**************************************************/

void main()

{

    init();



        while(1)

[1] [2]
关键字:单片机  直流电机  PWM调速 引用地址:基于单片机的直流电机PWM调速设计

上一篇:基于51单片机的PWM温控风扇
下一篇:51单片机+8155芯片的交通灯程序

推荐阅读最新更新时间:2024-11-10 15:59

51单片机学习笔记———13.2DS1302实时时钟代码部分(1)
代码: 实验序列:11.1 实验任务: 向DS1302中写入初始校准时间,然后不断从DS1302中读出时间并显示 实现现象:程序运行后动态数码管显示初始时间:23-59-50,并不断更新显示 硬件接线:同动态数码管一节要求。 注意事项:(1) DS1302的SPI接口用到了P3.4、P3.5、P3.6,若程序运行有问题查 硬件问题时可以从这三个引脚复用部分查起 (2) DS1302的初始化时间是随便给的,之所以给23.59.50,是为了在10 秒后即可看到24.59.59到00.00.00的跳变。 (3) DS1302寄存器读写的函数编写时要注意时序和LSB这2个要点。 ***
[单片机]
用51单片机实现音频信号的频谱显示
思路:外来音频信号经过51单片机,在单片机中进行频谱分析,并将结果显示在LCD(12864或1602)上 要求:频谱显示如同千千静听播放音乐时的频谱显示 希望各位高手能给出详细的解决方案,感激。。。。。。 51做FFT有些困难,可以使用增强型(RAM)的51机子进行 参考程序: #include STC12C5A.H #define uchar unsigned char #define uint unsigned int #define channel 0x01 //设置AD通道为 P1.1 //------------------------------------------------------------
[单片机]
只要单片机具有真正唯一ID,就可以让加密坚不可摧
第一环: ID-- F1(ID) -----》IDX, 将ID通过自定义的一个算法F1,转换为一个整数IDX , F1为不可逆运算,也不能被轻易分析,这个实际上是容易实现的。 然后,将IDX保存到EEPROM或FLASH的任何地方,我们通过编一个函数 GET_IDX()能够读出这个数即可。 第二环: 再编一个函数: int getmy_1(){ return F1(ID)-GET_IDX()+1; } int getmy_0(){ return F1(ID)-GET_IDX(); } 还有一些其他自定义的函数内:都可以直接使用(F1(ID)-GET_IDX()) 来替代0; 直接用(F1(ID)-GET_IDX(
[单片机]
单片机-stm32-使用cdc类实现vcp(虚拟串口)
本文所述内容基于STM32 HAL库完成 安装stm32CubeMx(ver4.26.0) 新建工程,选择stm32f412zg tx 配置RCC- HSE- crystal/Ceramic Resonnator 配置USB_OTG_FS- device only(disable Activate_VBUS) 配置MiddleWares- USB_DEVICE- communication device class(virtual Port com) 配置clock,input frequency设置为8Mhz 其他参数全部默认,生成代码 其中USBD_CDC_RegisterInterfac
[单片机]
<font color='red'>单片机</font>-stm32-使用cdc类实现vcp(虚拟串口)
STC12C5A60S2单片机-双串口通信
STC12C5A60S2 单片机 是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2只能使用独立波特率发生器作为波特率发生器。 芯片:STC12C5A60S2 晶振:22.1184MHz 波特率:9600bps 引脚定义:串行口1: 发送————TxD/P3.1; 接收————RxD/P3.0 串行口2: 发送————TxD2/P1.3;接收————RxD2/P1.2 功能描述:STC12双串口通信(中断
[单片机]
单片机模拟I2C总线通信的几个关键程序
I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序: 1、总线初始化 void main() { SCl=1; delay(); SDA=1; delay(); } //将总线都拉高以释放总线 2、启动信号 void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } //SCL在高电平期间,SDA一个下降沿启动信号 3、应答信号 void respons() { uchar i=0; SCL=1; dela
[单片机]
STM32单片机(3) 串口中断通信
注:使用普中科技开发板测试时,需要拔掉Boot1短接帽 两根下载线也要拿掉,重启 /******************************************************************************* * * 软件功能: 串口实验(软件延时方式) * *******************************************************************************/ #include stm32f10x.h #include string.h #include delay.h u8 uart1_buf ; int count=0
[单片机]
单片机可以烧写多少次程序?
单片机可以烧写多少次程序? 这个问题新手可能会问到?根据厂家提供的数据,通常烧写次数不低于10万次,但由于时间关系我们没有做过具体测试,请大家放心使用就可,也不要担心怕烧写坏单片机而节省烧写次数,买来学习板就是用来实验的,争取每天烧它几百次。 呵呵,大家努力捣鼓吧,终成单片机大虾的。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved