欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC15W4K60S2單片機2路SPWM源程序 可驅動電機
[打印本頁]
作者:
653334526
時間:
2018-9-3 07:21
標題:
STC15W4K60S2單片機2路SPWM源程序 可驅動電機
分享一個雙路的SPWM源碼可以驅動電機用
正弦表計算:
0.png
(32.23 KB, 下載次數: 44)
下載附件
2018-9-3 15:51 上傳
0.png
(44.15 KB, 下載次數: 28)
下載附件
2018-9-3 15:51 上傳
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, 無中斷
PWMCR |= 0x04; // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
// PWMCFG &= ~0x04; // 設置PWM輸出端口的初始電平為0
PWMCFG |= 0x04; // 設置PWM輸出端口的初始電平為1
P22 = 1;
P2n_push_pull(1<<2); //IO初始化, 上電時為高阻
px = PWMCH; // PWM計數器的高字節
*px = 2400 / 256;
px++;
*px = 2400 % 256; // PWM計數器的低字節
px++; // PWMCKS, PWM時鐘選擇
*px = PwmClk_1T; // 時鐘源: PwmClk_1T,PwmClk_2T, ... PwmClk_16T, PwmClk_Timer2
EAXRAM(); // 恢復訪問XRAM
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)
{
}
}
/********************* PWM中斷函數************************/
void PWM_int (void) interrupt PWM_VECTOR
{
u8 xdata *px;
u16 j;
u8 SW2_tmp;
if(PWMIF & CBIF) //PWM計數器歸零中斷標志
{
PWMIF &= ~CBIF; //清除中斷標志
SW2_tmp = P_SW2; //保存SW2設置
EAXSFR(); //訪問XFR
px = PWM3T2H; // 指向PWM3
j = T_SinTable[PWM_Index];
*px = (u8)(j >> 8); //第二個翻轉計數高字節
px++;
*px = (u8)j; //第二個翻轉計數低字節
j += PWM_DeadZone; //死區
px = PWM4T2H; // 指向PWM4
*px = (u8)(j >> 8); //第二個翻轉計數高字節
px++;
*px = (u8)j; //第二個翻轉計數低字節
P_SW2 = SW2_tmp; //恢復SW2設置
if(++PWM_Index >= 200) PWM_Index = 0;
}
/*
if(PWMIF & C2IF) //PWM2中斷標志
{
PWMIF &= ~C2IF; //清除中斷標志
}
if(PWMIF & C3IF) //PWM3中斷標志
{
PWMIF &= ~C3IF; //清除中斷標志
}
if(PWMIF & C4IF) //PWM4中斷標志
{
PWMIF &= ~C4IF; //清除中斷標志
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
STC15W4K60S2-2路SPWM.zip
(104.27 KB, 下載次數: 148)
2018-9-3 07:20 上傳
點擊文件名下載附件
SPWM
下載積分: 黑幣 -5
作者:
jhczy
時間:
2018-9-4 16:17
下來學習,謝謝分享
作者:
hewayking
時間:
2019-5-26 14:30
我試了 不行 正玄波有很大缺口
作者:
lvhm
時間:
2019-5-27 23:58
如何來驅動電機?
作者:
wanghaixuan
時間:
2019-9-12 15:02
謝謝分享
作者:
luchenzhijia
時間:
2020-4-24 11:38
感謝分享,謝謝大神1
作者:
beyondfortune
時間:
2020-12-5 16:39
請問:在另一個程序里,第37、38行 :
*px = 0; // PWM3輸出選擇P2.1, 無中斷
PWMCR |= 0x02; // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
和第53、54行:
*px = 0; // PWM4輸出選擇P2.2, 無中斷
PWMCR |= 0x04; // 相應PWM通道的端口為PWM輸出口,受PWM波形發生器控制
如果要換成第二組口 P4.5和 P4.4 該怎么弄啊? 用PWM3CR=0x08;根本加不進,編譯過不了
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1