STC15W4K60S2单片机2路SPWM源程序 可驱动电机

发布者:来来去去来来最新更新时间:2020-12-05 来源: 51hei关键字:单片机  驱动电机 手机看文章 扫描二维码
随时随地手机看文章

分享一个双路的SPWM源码可以驱动电机用


正弦表计算:

C语言库函数版本STC15W4K60S2单片机源程序如下:

#include        "config.h"

#include        "PWM.h"



/*************        功能说明        **************


演示使用2路PWM产生互补或同相的SPWM.


主时钟选择24MHZ, PWM时钟选择1T, PWM周期2400, 死区12个时钟(0.5us).正弦波表用200点.


输出正弦波频率 = 24000000 / 2400 / 200 = 50 HZ.


本程序仅仅是一个SPWM的演示程序, 用户可以通过上面的计算方法修改PWM周期和正弦波的点数和幅度.


本程序输出频率固定, 如果需要变频, 请用户自己设计变频方案.


本程序从P2.1(PWM3)输出正相脉冲, 从P2.2(PWM4)输出反相脉冲(互补).


如果需要P2.2输出同相的, 请在初始化配置中"Start_IO_Level"项选择0(设置PWM输出端口的初始电平, 0或1).



工程文件:

delay.c

pwm.c

main.c


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


/*************        本地常量声明        **************/



/*************        本地变量声明        **************/



/*************        本地函数声明        **************/




/*************  外部函数和变量声明 *****************/




//========================================================================

// 函数: void        PWM_config(void)

// 描述: PWM配置函数。

// 参数: none.

// 返回: none.

// 版本: VER1.0

// 日期: 2014-8-15

// 备注:

//========================================================================

void        PWM_config(void)

{

        PWMx_InitDefine                PWMx_InitStructure;                                        //结构定义

       

        PWMx_InitStructure.PWMx_IO_Select       = PWM3_P21;                //PWM输出IO选择. PWM2_P37,PWM2_P27,PWM3_P21,PWM3_P45,PWM4_P22,PWM4_P44,PWM5_P23,PWM5_P42,PWM6_P16,PWM6_P07,PWM7_P17,PWM7_P06

        PWMx_InitStructure.Start_IO_Level       = 0;                        //设置PWM输出端口的初始电平, 0或1

        PWMx_InitStructure.PWMx_Interrupt       = DISABLE;                //中断允许,                           ENABLE或DISABLE

        PWMx_InitStructure.FirstEdge_Interrupt  = DISABLE;                //第一个翻转中断允许,   ENABLE或DISABLE

        PWMx_InitStructure.SecondEdge_Interrupt = DISABLE;                //第二个翻转中断允许,   ENABLE或DISABLE

        PWMx_InitStructure.FirstEdge            = 65;                        //第一个翻转计数, 1~32767

        PWMx_InitStructure.SecondEdge           = 1220;                        //第二个翻转计数, 1~32767

        PWMx_Configuration(PWM3_ID, &PWMx_InitStructure);                //初始化PWM,         PWM2_ID,PWM3_ID,PWM4_ID,PWM5_ID,PWM6_ID,PWM7_ID

        P21 = 0;

        P2n_push_pull(1<<1);                                                                        //IO初始化, 上电时为高阻


        PWMx_InitStructure.PWMx_IO_Select       = PWM4_P22;                //PWM输出IO选择. PWM2_P37,PWM2_P27,PWM3_P21,PWM3_P45,PWM4_P22,PWM4_P44,PWM5_P23,PWM5_P42,PWM6_P16,PWM6_P07,PWM7_P17,PWM7_P06

        PWMx_InitStructure.Start_IO_Level       = 1;                        //设置PWM输出端口的初始电平, 0或1

        PWMx_InitStructure.PWMx_Interrupt       = DISABLE;                //中断允许,                           ENABLE或DISABLE

        PWMx_InitStructure.FirstEdge_Interrupt  = DISABLE;                //第一个翻转中断允许,   ENABLE或DISABLE

        PWMx_InitStructure.SecondEdge_Interrupt = DISABLE;                //第二个翻转中断允许,   ENABLE或DISABLE

        PWMx_InitStructure.FirstEdge            = 65-PWM_DeadZone;        //第一个翻转计数, 1~32767

        PWMx_InitStructure.SecondEdge           = 1220+PWM_DeadZone;//第二个翻转计数, 1~32767

        PWMx_Configuration(PWM4_ID, &PWMx_InitStructure);                //初始化PWM,         PWM2_ID,PWM3_ID,PWM4_ID,PWM5_ID,PWM6_ID,PWM7_ID

        P22 = 1;

        P2n_push_pull(1<<2);                                                                        //IO初始化, 上电时为高阻


        PWM_SourceClk_Duty(PwmClk_1T, 2400);        //时钟源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2,   PWM周期: 1~32767

       

        PWMCR |= ENPWM;                // 使能PWM波形发生器,PWM计数器开始计数

//        PWMCR &= ~ECBI;                //禁止PWM计数器归零中断

        PWMCR |=  ECBI;                //允许PWM计数器归零中断


//        PWMFDCR = ENFD | FLTFLIO | FDIO;        //PWM失效中断控制,  ENFD | FLTFLIO | EFDI | FDCMP | FDIO

}



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

void main(void)

{

       

        PWM_config();        //初始化PWM


        EA = 1;                        //允许全局中断


        while (1)

        {

               

        }

}

复制代码


另一个程序:

#define         MAIN_Fosc                24000000L        //定义主时钟


#include        "STC15Fxxxx.H"


#include        "T_SineTable.h"


#define                PWM_DeadZone        12        /* 死区时钟数, 6 ~ 24之间  */



u8        PWM_Index;        //SPWM查表索引



//========================================================================

// 函数: void        PWM_config(void)

// 描述: PWM配置函数。

// 参数: none.

// 返回: none.

// 版本: VER1.0

// 日期: 2014-8-15

// 备注:

//========================================================================

void        PWM_config(void)

{

        u8        xdata        *px;


        EAXSFR();                        // 访问XFR


        px = PWM3T1H;                // 指针指向PWM3

        *px = 0;                        // 第一个翻转计数高字节

        px++;

        *px = 65;                        // 第一个翻转计数低字节

        px++;

        *px = 1220 / 256;        // 第二个翻转计数高字节

        px++;

        *px = 1220 % 256;        // 第二个翻转计数低字节

        px++;

        *px = 0;                                // PWM3输出选择P2.1, 无中断

        PWMCR  |=  0x02;        // 相应PWM通道的端口为PWM输出口,受PWM波形发生器控制

        PWMCFG &= ~0x02;        // 设置PWM输出端口的初始电平为0

//        PWMCFG |=  0x02;        // 设置PWM输出端口的初始电平为1

        P21 = 0;

        P2n_push_pull(1<<1);        //IO初始化, 上电时为高阻


        px = PWM4T1H;                // 指针指向PWM4

        *px = 0;                        // 第一个翻转计数高字节

        px++;

        *px = 65-PWM_DeadZone;                        // 第一个翻转计数低字节

        px++;

        *px = (1220+PWM_DeadZone) / 256;        // 第二个翻转计数高字节

        px++;

        *px = (1220+PWM_DeadZone) % 256;        // 第二个翻转计数低字节

        px++;

        *px = 0;                        // PWM4输出选择P2.2, 无中断

[1] [2]
关键字:单片机  驱动电机 引用地址:STC15W4K60S2单片机2路SPWM源程序 可驱动电机

上一篇:51单片机红外遥控解码器设计(汇编语言)
下一篇:带中断的单片机红绿灯

推荐阅读最新更新时间:2024-11-13 02:07

89C51单片机的P0~P3端口进行输入时为什么要设置为1?
89C51 单片机 的P0~P3口不是标准意义的双向口 ,他只是准双向口, 你可以对照着P0口的 结构图 看这段话,向端口写1,就是向锁存器写1, 也就是让其口输出FF,为什么,是这样的,给锁存器写1,那么锁存器 的反向端就输出0,那么和它相接的MOS管也就在截止状态,也就是呈高 阻态,这样P0口上数据就会从读引脚的三态 缓冲器 上正确的输入,如果 不写1,那么锁存器上次锁存的可能为0,那么反向端有可能出现1,这样 和反向端相接的MOS管就倒通,也就是直接拉到地,那么不管你P0口上输 入什么信号都会拉成低 电平 ,输入就错了 双向口与准双向口的区别主要是:准双向口I/O口操作时做数据输入时需 要对其置1,否则若前一位为低电平,后
[单片机]
89C51<font color='red'>单片机</font>的P0~P3端口进行输入时为什么要设置为1?
单片机在数字多用表中的应用设计
1DS1629的结构特性与工作原理   DS1629是专为温度的数字化测量而设计的一种芯片,同时还兼有实时时钟/日历的功能。DS1629的宽电源范围和极小的功耗非常适合于电池供电的应用环境。其时钟功能可以是12小时或者24小时的模式,且在12小时的模式下带有AM/PM指示。当温度达到或超过程序设定的上限TH或者时间到达程序设定的时刻时,芯片就产生漏极开路的报警输出。   DS1629由数字温度传感器、实时时钟、两线串行接口、数据寄存器、温度和时钟报警比较器及时钟分频器和缓冲器6个部分组成。   由制造商标定的温度传感器无需外部器件。芯片一上电就开始进行温度转换,并随后连续进行转换。主机(通常为单片机)可以周期性地读取
[单片机]
<font color='red'>单片机</font>在数字多用表中的应用设计
MCS-51单片机并行P3口的功能及特性
MCS-51系列单片机并行P3口为多功能口,它的第一功能为准双向口,可以作为通用I/O口使用,其特性和P1口相似 。但在实际应用中它的第二功能信号更多。 P3口的口锁存器Q端接与非门驱动输出场效应管T,该与非门的另一个控制端为第二功能输出线。P3口的引脚状态通过输入缓冲器输入到内部总线和第二功能输入线。 P3口的每一位可以分别定义为第一功能输入/输出线或第二功能输入/输出线。 P3口的某一位作为第一功能输入/输出线时,第二功能输出线总是为高电平,该位引脚输出电平仅取决于口锁存器的状态,为“1”时输出高电平,为“0”时输出低电平。 P3口的某一位作为输入线时,该位口锁存器应保持“1”,使输出场效应管T截止,引脚状态由外部
[单片机]
MCS-51<font color='red'>单片机</font>并行P3口的功能及特性
单片机VB6对汉字的处理
在DOS时代,拥有一个华丽的汉字菜单几乎是每个高档中文应用程序必须的包装。中文Windows操作系统的出现使得高级开发平台实现全中文的提示和界面非常容易和方便。在一般的应用程序中已经很少需要去专门考虑汉字处理的问题。 但是在许多工程控制和字符串处理的环境中,汉字字符的处理仍然有别于西文字符的处理,需要加以专门的考虑。 一、VB6对汉字处理的支持 对汉字处理,VB6主要是提供了一些输入法设置方面的支持。它提供了一个ImeMode属性和ImeStatus函数来确定和设置输入法的状态。而且此属性和方法只在VB6的东亚区版本中有效。 IMEStatus函数返回一个整数,用来指定当前Windows的输入法(IME)方式。
[单片机]
<font color='red'>单片机</font>VB6对汉字的处理
eMMC芯片磨损导致MCU和车辆无法正常运作| 这是怎么回事?
监督成本| eMMC NAND闪存技术和用例需求 ODI最近对较旧的Teslas Model S和Model X车辆提出的信息要求突显了工作负载疏忽,其中基于NVIDIA Tegra 3处理器和集成8GB eMMC NAND闪存的主控制单元(MCU)遇到了问题。当引入新的固件更新为电动汽车(EV)带来附加功能时,问题变得更加复杂。这充当进一步激发NAND闪存磨损进度的燃料。尽管在一开始固件不是问题,并且记录的数据具有足够的内存来处理工作量,但每次固件升级都带来了新功能,从而减少了每次更新的存储空间。应ODI的信息请求,特斯拉列出了2,399项投诉和现场报告,7,777项保修索赔以及4,746项与MCU替换方案有关的非保修索赔
[汽车电子]
eMMC芯片磨损导致<font color='red'>MCU</font>和车辆无法正常运作| 这是怎么回事?
GD32 MCU的引脚输出功能应用配置
GD32的GPIO口的输出功能-LED0闪烁实验 硬件:深圳标航科技有限公司 暴风 开发板 处理器:GD32F103VET6 开发环境:MDK(keil 5) + STM32CubeMX 1.1 GD32F103VET6的IO引脚图 由于GD32和STM32是PIN对PIN的,他们的引脚排列、封装、大小都完全相同,所以GD32F103VET6的引脚结构与STM32F103VET6完全一样,由于大家都对STM32比较熟悉,所以这里直接采用STM32F103VET6的引脚图当做GD32F103VET6的引脚图,该引脚图如图1所示。 图1 GD32F103VET6的引脚分布图 由图可见,GD32F103VET6 (在后续介绍中,
[单片机]
GD32 <font color='red'>MCU</font>的引脚输出功能应用配置
什么是单片微型计算机
单片微型计算机(Single Chip Microcomputer),简称单片机,是指集成在一块芯片上的计算机,它具有集成度高、体积小、功能强、使用灵活、价格低廉、稳定可靠等独特的优点,因而广泛应用于工业控制、智能化仪器、数控车床、数据采集和处理、通信、智能机器人、家用电器等各个领域。 单片微型计算机是指集成在一个芯片上的微型计算机,也就是把组成微型计算机的各种功能部件,包括CPU(Central Processing Unit)、随机存取存储器RAM(Random Access Memory)、只读存储器ROM(Read-only Memory)、基本输入/输出(Input/Output)接口电路、定时器/计数器等部件制作在一块集
[单片机]
什么是单片微型计算机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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