資料介紹
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: 13922805190 --------------------------------------------*/
/* --- Fax: 0513-55012956,55012947,55012969 ---------------------------*/
/* --- Tel: 0513-55012928,55012929,55012966 ---------------------------*/
/* --- Web: www.GXWMCU.com ? www.stcmcu.com ---------------------------*/
/* --- QQ: ?800003751 -------------------------------------------------*/
/* 如果要在程序中使用此代碼,請在程序中注明使用了宏晶科技的資料及程序 ? */
/*---------------------------------------------------------------------*/
/*************????功能說明????**************
本程序試驗使用STC8H1K28-LQFP32來驅動帶霍爾傳感器的無刷三相直流電機.
PWM的捕捉中斷功能用來檢測霍爾信號.
P0.3接的電位器控制轉速, 處于中間位置為停止, 逆時針旋轉電位器電壓降低電機為逆時針轉, 順時針旋轉電位器電壓升高電機為順時針轉.
關于帶霍爾傳感器三相無刷直流電機的原理, 用戶自行學習了解, 本例不予說明.
******************************************/
#define MAIN_Fosc????????24000000L????//定義主時鐘
#include????"STC8Hxxx.h"
#define ADC_START????(1<<6)????/* 自動清0 */
#define ADC_FLAG????(1<<5)????/* 軟件清0 */
#define????ADC_SPEED????1????????/* 0~15, ADC時鐘 = SYSclk/2/(n+1) */
#define????RES_FMT????????(1<<5)????/* ADC結果格式 0: 左對齊, ADC_RES: D9 D8 D7 D6 D5 D4 D3 D2, ADC_RESL: D1 D0 0 ?0 ?0 ?0 ?0 ?0 */
????????????????????????????/* ? ? ? ? ? ? 1: 右對齊, ADC_RES: 0 ?0 ?0 ?0 ?0 ?0 ?D9 D8, ADC_RESL: D7 D6 D5 D4 D3 D2 D1 D0 */
#define CSSETUP????????(0<<7)????/* 0~1, ?ADC通道選擇時間 ? ? ?0: 1個ADC時鐘, 1: 2個ADC時鐘, ?默認0(默認1個ADC時鐘) */
#define CSHOLD????????(1<<5)????/* 0~3, ?ADC通道選擇保持時間 ?(n+1)個ADC時鐘, 默認1(默認2個ADC時鐘) ? ? ? ? ? ? ? ?*/
#define SMPDUTY????????20????????/* 10~31, ADC模擬信號采樣時間 ?(n+1)個ADC時鐘, 默認10(默認11個ADC時鐘)????????????????*/
????????????????????????????/* ADC轉換時間: 10位ADC固定為10個ADC時鐘, 12位ADC固定為12個ADC時鐘. ????????????????*/
sbit PWM1 ? = P1^0;
sbit PWM1_L = P1^1;
sbit PWM2 ? = P1^2;
sbit PWM2_L = P1^3;
sbit PWM3 ? = P1^4;
sbit PWM3_L = P1^5;
u8????step;????????//切換步驟
u8????PWM_Value;????// 決定PWM占空比的值
bit????B_RUN;????????//運行標志
u8????PWW_Set;????//目標PWM設置
u8????YouMen;????????//油門
bit????B_direct;????//轉向, 0順時針, 1逆時針
bit????B_4ms;????????//4ms定時標志
/*************************/
//========================================================================
// 函數(shù): u16????Get_ADC10bitResult(u8 channel))????//channel = 0~15
//========================================================================
u16????Get_ADC10bitResult(u8 channel)????//channel = 0~15
{
????u8 i;
????ADC_RES = 0;
????ADC_RESL = 0;
????ADC_CONTR = 0x80 | ADC_START | channel;?
????NOP(5);????????????//
????i = 255;????????//超時限制
????while(i != 0)
????{
????????i--;
????????if((ADC_CONTR & ADC_FLAG) != 0)????break;????//等待ADC結束
????}
????ADC_CONTR &= ~ADC_FLAG;
????return????((u16)ADC_RES * 256 + (u16)ADC_RESL);
}
void????Delay_500ns(void)
{
????NOP(6);
}
void StepMotor(void) // 換相序列函數(shù)
{
????PWMB_IER ? = 0;
????PWMB_CCER1 = 0;
????PWMB_CCER2 = 0;
????step = P2 & 0x07;????//P2.0-HALL_A P2.1-HALL_B P2.2-HALL_C
????if(!B_direct)????//順時針
????{
????????switch(step)
????????{
????????case 2: ?// 010, P2.0-HALL_A下降沿 ?PWM3, PWM2_L=1????????//順時針
????????????????PWMA_ENO = 0x00;????PWM1_L=0;????PWM3_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x10;????// 打開C相的高端PWM
????????????????PWM2_L = 1;????????????// 打開B相的低端
????????????????PWMB_CCER2 = (0x01+0x00);????//P2.2 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x08;????????????//P2.2 使能中斷
????????????????break;
????????case 6: ?// 110, P2.2-HALL_C上升沿 ?PWM3, PWM1_L=1
????????????????PWMA_ENO = 0x10;????PWM2_L=0;????PWM3_L=0;????// 打開C相的高端PWM
????????????????Delay_500ns();
????????????????PWM1_L = 1;????????????// 打開A相的低端
????????????????PWMB_CCER1 = (0x10+0x20);????//P2.1 0x10:允許輸入捕獲, +0x00:上升沿, +0x20:下降沿
????????????????PWMB_IER ? = 0x04;????????????//P2.1 使能中斷
????????????????break;
????????case 4: ?// 100, P2.1-HALL_B下降沿 ?PWM2, PWM1_L=1
????????????????PWMA_ENO = 0x00;????PWM2_L=0;????PWM3_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x04;????// 打開B相的高端PWM
????????????????PWM1_L = 1;????????????// 打開A相的低端
????????????????PWMB_CCER1 = (0x01+0x00);????//P2.0 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x02;????????????//P2.0 使能中斷
????????????????break;
????????case 5: ?// 101, P2.0-HALL_A上升沿 ?PWM2, PWM3_L=1
????????????????PWMA_ENO = 0x04;????PWM1_L=0;????PWM2_L=0;????// 打開B相的高端PWM
????????????????Delay_500ns();
????????????????PWM3_L = 1;????????????// 打開C相的低端
????????????????PWMB_CCER2 = (0x01+0x02);????//P2.2 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x08;????????????//P2.2 使能中斷
????????????????break;
????????case 1: ?// 001, P2.2-HALL_C下降沿 ?PWM1, PWM3_L=1
????????????????PWMA_ENO = 0x00;????PWM1_L=0;????PWM2_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x01;????// 打開A相的高端PWM
????????????????PWM3_L = 1;????????????// 打開C相的低端
????????????????PWMB_CCER1 = (0x10+0x00);????//P2.1 0x10:允許輸入捕獲, +0x00:上升沿, +0x20:下降沿
????????????????PWMB_IER ? = 0x04;????????????//P2.1 使能中斷
????????????????break;
????????case 3: ?// 011, P2.1-HALL_B上升沿 ?PWM1, PWM2_L=1
????????????????PWMA_ENO = 0x01;????PWM1_L=0;????PWM3_L=0;????// 打開A相的高端PWM
????????????????Delay_500ns();
????????????????PWM2_L = 1;????????????// 打開B相的低端
????????????????PWMB_CCER1 = (0x01+0x02);????//P2.0 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x02;????????????//P2.0 使能中斷
????????????????break;
????????default:
????????????????break;
????????}
????}
????else????//逆時針
????{
????????switch(step)
????????{
????????case 4: ?// 100, P2.0-HALL_A下降沿 ?PWM1, PWM2_L=1????????//逆時針
????????????????PWMA_ENO = 0x00;????PWM1_L=0;????PWM3_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x01;????// 打開A相的高端PWM
????????????????PWM2_L = 1;????????????// 打開B相的低端
????????????????PWMB_CCER1 = (0x10+0x00);????//P2.1 0x10:允許輸入捕獲, +0x00:上升沿, +0x20:下降沿
????????????????PWMB_IER ? = 0x04;????????????//P2.1 使能中斷
????????????????break;
????????case 6: ?// 110, P2.1-HALL_B上升沿 ?PWM1, PWM3_L=1
????????????????PWMA_ENO = 0x01;????PWM1_L=0;????PWM2_L=0;????// 打開A相的高端PWM
????????????????Delay_500ns();
????????????????PWM3_L = 1;????????????// 打開C相的低端
????????????????PWMB_CCER2 = (0x01+0x02);????//P2.2 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x08;????????????//P2.2 使能中斷
????????????????break;
????????case 2: ?// 010, P2.2-HALL_C下降沿 ?PWM2, PWM3_L=1
????????????????PWMA_ENO = 0x00;????PWM1_L=0;????PWM2_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x04;????// 打開B相的高端PWM
????????????????PWM3_L = 1;????????????// 打開C相的低端
????????????????PWMB_CCER1 = (0x01+0x00);????//P2.0 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x02;????????????//P2.0 使能中斷
????????????????break;
????????case 3: ?// 011, P2.0-HALL_A上升沿 ?PWM2, PWM1_L=1
????????????????PWMA_ENO = 0x04;????PWM2_L=0;????PWM3_L=0;????// 打開B相的高端PWM
????????????????Delay_500ns();
????????????????PWM1_L = 1;????????????// 打開A相的低端
????????????????PWMB_CCER1 = (0x10+0x20);????//P2.1 0x10:允許輸入捕獲, +0x00:上升沿, +0x20:下降沿
????????????????PWMB_IER ? = 0x04;????????????//P2.1 使能中斷
????????????????break;
????????case 1: ?// 001, P2.1-HALL_B下降沿 ?PWM3, PWM1_L=1
????????????????PWMA_ENO = 0x00;????PWM2_L=0;????PWM3_L=0;
????????????????Delay_500ns();
????????????????PWMA_ENO = 0x10;????// 打開C相的高端PWM
????????????????PWM1_L = 1;????????????// 打開A相的低端
????????????????PWMB_CCER2 = (0x01+0x00);????//P2.2 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x08;????????????//P2.2 使能中斷
????????????????break;
????????case 5: ?// 101, P2.2-HALL_C上升沿 ?PWM3, PWM2_L=1
????????????????PWMA_ENO = 0x10;????PWM1_L=0;????PWM3_L=0;????// 打開C相的高端PWM
????????????????Delay_500ns();
????????????????PWM2_L = 1;????????????// 打開B相的低端
????????????????PWMB_CCER1 = (0x01+0x02);????//P2.0 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????????????????PWMB_IER ? = 0x02;????????????//P2.0 使能中斷
????????????????break;
????
????????default:
????????????????break;
????????}
????}
}
void PWMA_config(void)
{
????P_SW2 |= 0x80;????????//SFR enable ?
????PWM1 ? = 0;
????PWM1_L = 0;
????PWM2 ? = 0;
????PWM2_L = 0;
????PWM3 ? = 0;
????PWM3_L = 0;
????P1n_push_pull(0x3f);
????PWMA_PSCR = 3;????????// 預分頻寄存器, 分頻 Fck_cnt = Fck_psc/(PSCR[15:0}+1), 邊沿對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)), 中央對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)*2).
????PWMA_DTR ?= 24;????????// 死區(qū)時間配置, n=0~127: DTR= n T, ? 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T, ?
????????????????????????//????????????????0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, ? 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
????PWMA_ARR ? ?= 255;????// 自動重裝載寄存器, ?控制PWM周期
????PWMA_CCER1 ?= 0;
????PWMA_CCER2 ?= 0;
????PWMA_SR1 ? ?= 0;
????PWMA_SR2 ? ?= 0;
????PWMA_ENO ? ?= 0;
????PWMA_PS ? ? = 0;
????PWMA_IER ? ?= 0;
//????PWMA_ISR_En = 0;
????PWMA_CCMR1 ?= 0x68;????????// 通道模式配置, PWM模式1, 預裝載允許
????PWMA_CCR1 ? = 0;????????// 比較值, 控制占空比(高電平時鐘數(shù))
????PWMA_CCER1 |= 0x05;????????// 開啟比較輸出, 高電平有效
????PWMA_PS ? ?|= 0;????????// 選擇IO, 0:選擇P1.0 P1.1, 1:選擇P2.0 P2.1, 2:選擇P6.0 P6.1,?
//????PWMA_ENO ? |= 0x01;????????// IO輸出允許, ?bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P, ?bit3: ENO2N, ?bit2: ENO2P, ?bit1: ENO1N, ?bit0: ENO1P
//????PWMA_IER ? |= 0x02;????????// 使能中斷
????PWMA_CCMR2 ?= 0x68;????????// 通道模式配置, PWM模式1, 預裝載允許
????PWMA_CCR2 ? = 0;????????// 比較值, 控制占空比(高電平時鐘數(shù))
????PWMA_CCER1 |= 0x50;????????// 開啟比較輸出, 高電平有效
????PWMA_PS ? ?|= (0<<2);????// 選擇IO, 0:選擇P1.2 P1.3, 1:選擇P2.2 P2.3, 2:選擇P6.2 P6.3,?
//????PWMA_ENO ? |= 0x04;????????// IO輸出允許, ?bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P, ?bit3: ENO2N, ?bit2: ENO2P, ?bit1: ENO1N, ?bit0: ENO1P
//????PWMA_IER ? |= 0x04;????????// 使能中斷
????PWMA_CCMR3 ?= 0x68;????????// 通道模式配置, PWM模式1, 預裝載允許
????PWMA_CCR3 ? = 0;????????// 比較值, 控制占空比(高電平時鐘數(shù))
????PWMA_CCER2 |= 0x05;????????// 開啟比較輸出, 高電平有效
????PWMA_PS ? ?|= (0<<4);????// 選擇IO, 0:選擇P1.4 P1.5, 1:選擇P2.4 P2.5, 2:選擇P6.4 P6.5,?
//????PWMA_ENO ? |= 0x10;????????// IO輸出允許, ?bit7: ENO4N, bit6: ENO4P, bit5: ENO3N, bit4: ENO3P, ?bit3: ENO2N, ?bit2: ENO2P, ?bit1: ENO1N, ?bit0: ENO1P
//????PWMA_IER ? |= 0x08;????????// 使能中斷
????PWMA_BKR ? ?= 0x80;????????// 主輸出使能 相當于總開關
????PWMA_CR1 ? ?= 0x81;????????// 使能計數(shù)器, 允許自動重裝載寄存器緩沖, 邊沿對齊模式, 向上計數(shù), ?bit7=1:寫自動重裝載寄存器緩沖(本周期不會被打擾), =0:直接寫自動重裝載寄存器本(周期可能會亂掉)
????PWMA_EGR ? ?= 0x01;????????//產(chǎn)生一次更新事件, 清除計數(shù)器和與分頻計數(shù)器, 裝載預分頻寄存器的值
//????PWMA_ISR_En = PWMA_IER;????//設置標志允許通道1~4中斷處理
}
//????PWMA_PS ? = (0<<6)+(0<<4)+(0<<2)+0;????//選擇IO, 4項從高到低(從左到右)對應PWM1 PWM2 PWM3 PWM4, 0:選擇P1.x, 1:選擇P2.x, 2:選擇P6.x,?
// ?PWMA_PS ? ?PWM4N PWM4P ? ?PWM3N PWM3P ? ?PWM2N PWM2P ? ?PWM1N PWM1P
// ? ?00 ? ? ? P1.7 ?P1.6 ? ? P1.5 ?P1.4 ? ? P1.3 ?P1.2 ? ? P1.1 ?P1.0
// ? ?01 ? ? ? P2.7 ?P2.6 ? ? P2.5 ?P2.4 ? ? P2.3 ?P2.2 ? ? P2.1 ?P2.0
// ? ?02 ? ? ? P6.7 ?P6.6 ? ? P6.5 ?P6.4 ? ? P6.3 ?P6.2 ? ? P6.1 ?P6.0
// ? ?03 ? ? ? P3.3 ?P3.4 ? ? ?-- ? ?-- ? ? ? -- ? ?-- ? ? ? -- ? ?--
//========================================================================
// 函數(shù): void PWMB_config(void)
// 描述: PPWM配置函數(shù)。
// 參數(shù): noe.
// 返回: none.
// 版本: V1.0, 2021-5-10
// 備注:?
//========================================================================
void PWMB_config(void)
{
????P_SW2 |= 0x80;????????//SFR enable ?
????PWMB_PSCR = 11;????// 預分頻寄存器, 分頻 Fck_cnt = Fck_psc/(PSCR[15:0]+1), 邊沿對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)), 中央對齊PWM頻率 = SYSclk/((PSCR+1)*(AAR+1)*2).
????PWMB_DTR ?= 0;????// 死區(qū)時間配置, n=0~127: DTR= n T, ? 0x80 ~(0x80+n), n=0~63: DTR=(64+n)*2T, ?
????????????????????//????????????????0xc0 ~(0xc0+n), n=0~31: DTR=(32+n)*8T, ? 0xE0 ~(0xE0+n), n=0~31: DTR=(32+n)*16T,
????PWMB_CCER1 ?= 0;
????PWMB_CCER2 ?= 0;
????PWMB_CR1 ? ?= 0;????????// 使能計數(shù)器, 允許自動重裝載寄存器緩沖, 邊沿對齊模式, 向上計數(shù), ?bit7=1:寫自動重裝載寄存器緩沖(本周期不會被打擾), =0:直接寫自動重裝載寄存器本(周期可能會亂掉)
????PWMB_CR2 ? ?= 0;
????PWMB_SR1 ? ?= 0;
????PWMB_SR2 ? ?= 0;
????PWMB_ENO ? ?= 0;????//IO禁止輸出PWM, ?bit6: ENO8P, bit4: ENO7P, ?bit2: ENO5P, ?bit0: ENO4P
????PWMB_PS ? ? = 0;
????PWMB_IER ? ?= 0;
????PWMB_CCMR1 ?= 0x31;????????// 通道5模式配置, 配置成輸入通道, 8個時鐘濾波
//????PWMB_CCER1 |= (0x01+0x02);????// 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????PWMB_PS ? ?|= 0;????????// 選擇IO, 0:選擇P2.0, 1:選擇P1.7, 2:選擇P0.0, 3:選擇P7.4,
//????PWMB_IER ? |= 0x02;????????// 使能中斷
????PWMB_CCMR2 ?= 0x31;????????// 通道6模式配置, 配置成輸入通道, 8個時鐘濾波
//????PWMB_CCER1 |= (0x10+0x20);????// 0x10:允許輸入捕獲, +0x00:上升沿, +0x20:下降沿
????PWMB_PS ? ?|= (0<<2);????// 0:選擇P2.1, 1:選擇P5.4, 2:選擇P0.1, 3:選擇P7.5,?
//????PWMB_IER ? |= 0x04;????????// 使能中斷
????PWMB_CCMR3 ?= 0x31;????????// 通道7模式配置, 配置成輸入通道, 8個時鐘濾波
//????PWMB_CCER2 |= (0x01+0x02);????// 0x01:允許輸入捕獲, +0x00:上升沿, +0x02:下降沿
????PWMB_PS ? ?|= (0<<4);????// 選擇IO, 0:選擇P2.2, 1:選擇P3.3, 2:選擇P0.2, 3:選擇P7.6,?
//????PWMB_IER ? |= 0x08;????????// 使能中斷
????PWMB_EGR ? ?= 0x01;????????//產(chǎn)生一次更新事件, 清除計數(shù)器和預分頻計數(shù)器, 裝載預分頻寄存器的值
????PWMB_SMCR ? = 0x60;
????PWMB_BKR ? ?= 0x00;????????//主輸出使能 相當于總開關
????PWMB_CR1 ? |= 0x01;????????// 使能計數(shù)器, 允許自動重裝載寄存器緩沖, 邊沿對齊模式, 向上計數(shù), ?bit7=1:寫自動重裝載寄存器緩沖(本周期不會被打擾), =0:直接寫自動重裝載寄存器本(周期可能會亂掉)
//????P2n_standard(0x07);????//通道5 6 7輸出IO設置為準雙向口
}
//????PWMB_PS ? = (0<<6)+(0<<4)+(0<<2)+0;????//選擇IO, 4項從高到低(從左到右)對應PWM8 PWM7 PWM6 PWM5
// ?PWMB_PS ? ?PWM8 ? ?PWM7 ? ?PWM6 ? ?PWM5
// ? ?00 ? ? ? P2.3 ? ?P2.2 ? ?P2.1 ? ?P2.0
// ? ?01 ? ? ? P3.4 ? ?P3.3 ? ?P5.4 ? ?P1.7
// ? ?02 ? ? ? P0.3 ? ?P0.2 ? ?P0.1 ? ?P0.0
// ? ?03 ? ? ? P7.7 ? ?P7.6 ? ?P7.5 ? ?P7.4
//========================================================================
// 函數(shù): void PWMB_ISR(void) interrupt PWMB_VECTOR
// 描述: PWMB中斷處理程序. 捕獲數(shù)據(jù)通過 TIM1-> CCRnH / TIM1-> CCRnL 讀取
// 參數(shù): None
// 返回: none.
// 版本: V1.0, 2021-6-1
//========================================================================
void PWMB_ISR(void) interrupt PWMB_VECTOR
{
????PWMB_SR1 = 0;????//清除中斷標志
????PWMB_SR2 = 0;????//清除中斷標志
????if(B_RUN)????StepMotor();????//換相
}
?
void ADC_config(void)????//ADC初始化函數(shù)
{
????P1n_pure_input(0xc0);????//P1.7 P1.6設置為高阻輸入
????P0n_pure_input(0x0f);????//P0.3~P0.0設置為高阻輸入
????ADC_CONTR = 0x80 + 6;????//ADC on + channel
????ADCCFG = RES_FMT + ADC_SPEED;
????P_SW2 |= ?0x80;????//訪問XSFR
????ADCTIM = CSSETUP + CSHOLD + SMPDUTY;
}
void Timer0_config(void)????//Timer0初始化函數(shù)
{
????Timer0_16bitAutoReload(); // T0工作于16位自動重裝
????Timer0_12T();
????TH0 = (65536UL-MAIN_Fosc/12 / 250) / 256; //4ms
????TL0 = (65536UL-MAIN_Fosc/12 / 250) % 256;
????TR0 = 1; // 打開定時器0
????ET0 = 1;// 允許ET0中斷
}
void Timer0_ISR(void) interrupt 1????//Timer0中斷函數(shù)
{
????B_4ms = 1;????//4ms定時標志
//????if(B_RUN)????StepMotor();????//換相, 增加定時器里換相可以保證啟動成功.
}
/**********************************************/
void main(void)
{
????P2n_standard(0xf8);
????P3n_standard(0xbf);
????P5n_standard(0x10);
????
????
????PWMA_config();
????PWMB_config();
????ADC_config();
????Timer0_config();????//Timer0初始化函數(shù)
????PWW_Set = 0;
????EA ?= 1; // 打開總中斷
????while (1)
????{
????????if(B_4ms)????????// 4ms時隙
????????{
????????????B_4ms = 0;
????????????YouMen ?= (u8)(Get_ADC10bitResult(11) >> 2);????//油門是8位的, P0.3 ADC11-->控制電位器輸入
????????????if(YouMen >= 128)????PWW_Set = YouMen - 128, B_direct = 0;????//順時針
????????????else????????????????PWW_Set = 127 - YouMen, B_direct = 1;????//逆時針
????????????PWW_Set *= 2;????//PWM設置值0~254
????????????if(!B_RUN && (PWW_Set >= 30))????????// PWM_Set >= 30, 并且電機未運行, 則啟動電機
????????????{
????????????????PWM_Value = 30;????????????//啟動電機的最低PWM, 根據(jù)具體電機而定
????????????????PWMA_CCR1L = PWM_Value;????//輸出PWM
????????????????PWMA_CCR2L = PWM_Value;
????????????????PWMA_CCR3L = PWM_Value;
????????????????B_RUN = 1;????????//標注運行
????????????????StepMotor();????//啟動換相
????????????}
????????????if(B_RUN)????//正在運行中
????????????{
????????????????if(PWM_Value < PWW_Set)????PWM_Value++;????//油門跟隨電位器, 調速柔和
????????????????if(PWM_Value > PWW_Set)????PWM_Value--;
????????????????if(PWM_Value < 20)????// 停轉
????????????????{
????????????????????B_RUN = 0;
????????????????????PWMB_IER ? = 0;
????????????????????PWMB_CCER1 = 0;
????????????????????PWMB_CCER2 = 0;
????????????????????PWM_Value = 0;
????????????????????PWMA_ENO ?= 0;
????????????????????PWMA_CCR1L = 0;
????????????????????PWMA_CCR2L = 0;
????????????????????PWMA_CCR3L = 0;
????????????????????PWM1_L=0;
????????????????????PWM2_L=0;
????????????????????PWM3_L=0;
????????????????}
????????????????else
????????????????{
????????????????????PWMA_CCR1L = PWM_Value;
????????????????????PWMA_CCR2L = PWM_Value;
????????????????????PWMA_CCR3L = PWM_Value;
????????????????}
????????????}
????????}
????}
}
?
?
- 無刷直流電機與有刷直流電機的區(qū)別
- 三相無刷直流電機驅動器參考設計
- STM32驅動無刷直流電機
- 三相無刷直流電機
- 無刷直流電機原理
- 無刷直流電機原理圖
- 永磁無刷直流電機簡介
- 三相無刷直流電機原理和控制方法
- 無刷直流電機的工作原理
- 無刷直流電機驅動控制板
- 好用的無刷直流電機論文下載 26次下載
- 兩相無刷直流電機矢量控制系統(tǒng) 21次下載
- YF3405 無刷直流電機驅動控制電路
- 無刷直流電機的原理與驅動
- 三相無刷直流電機調速系統(tǒng)的仿真
- 無刷直流電機的類型和工作原理 1530次閱讀
- 永磁無刷直流電機的控制方法 871次閱讀
- 有刷直流電機的PWM驅動原理 8390次閱讀
- 有刷直流電機基礎知識及驅動電路 1.2w次閱讀
- 無刷直流電機的優(yōu)勢及工作原理 6097次閱讀
- 微型有刷直流電機與無刷電機對比分析 3137次閱讀
- 什么是無刷直流電機(BLDC)以及它的應用 5.1w次閱讀
- 解析什么是無刷直流電機(BLDC) 2.2w次閱讀
- 無刷直流電機的特點及應用領域 2.1w次閱讀
- 一文解析無刷直流電機與直流有刷電機的區(qū)別 4.4w次閱讀
- IR2110在無刷直流電機驅動電路中的應用 1.8w次閱讀
- 淺析無刷直流電機,無刷直流電機的工作原理及其結構構成 2.6w次閱讀
- 無刷直流電機的控制策略與無刷直流電機仿人智能系統(tǒng)設計 3922次閱讀
- 基于DSP的三相8極無刷直流電機控制設計 4757次閱讀
- 簡化三相無刷直流電機控制和驅動系統(tǒng)的策略 4946次閱讀
下載排行
本周
- 1電子電路原理第七版PDF電子教材免費下載
- 0.00 MB | 1490次下載 | 免費
- 2單片機典型實例介紹
- 18.19 MB | 92次下載 | 1 積分
- 3S7-200PLC編程實例詳細資料
- 1.17 MB | 27次下載 | 1 積分
- 4筆記本電腦主板的元件識別和講解說明
- 4.28 MB | 18次下載 | 4 積分
- 5開關電源原理及各功能電路詳解
- 0.38 MB | 10次下載 | 免費
- 6基于AT89C2051/4051單片機編程器的實驗
- 0.11 MB | 4次下載 | 免費
- 7藍牙設備在嵌入式領域的廣泛應用
- 0.63 MB | 3次下載 | 免費
- 89天練會電子電路識圖
- 5.91 MB | 3次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 2PADS 9.0 2009最新版 -下載
- 0.00 MB | 66304次下載 | 免費
- 3protel99下載protel99軟件下載(中文版)
- 0.00 MB | 51209次下載 | 免費
- 4LabView 8.0 專業(yè)版下載 (3CD完整版)
- 0.00 MB | 51043次下載 | 免費
- 5555集成電路應用800例(新編版)
- 0.00 MB | 33562次下載 | 免費
- 6接口電路圖大全
- 未知 | 30320次下載 | 免費
- 7Multisim 10下載Multisim 10 中文版
- 0.00 MB | 28588次下載 | 免費
- 8開關電源設計實例指南
- 未知 | 21539次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935053次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537791次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234313次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233045次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191183次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183277次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138039次下載 | 免費
評論
查看更多