天天看點

STC8——PWM介紹及使用1、相關寄存器2、編寫流程

目錄

  • 1、相關寄存器
  • 2、編寫流程

1、相關寄存器

  • 增強型 PWM 控制寄存器(切換引腳功能)
STC8——PWM介紹及使用1、相關寄存器2、編寫流程
  • 控制寄存器
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程
  • PWM 時鐘選擇寄存器
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程
  • PWM 翻轉點設定計數值寄存器
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程
  • PWM 計數值寄存器
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程
  • PWM 通道控制寄存器
    STC8——PWM介紹及使用1、相關寄存器2、編寫流程

2、編寫流程

  • 配置GPIO工作模式(推挽輸出)
  • 切換PWM引腳
  • 設定時鐘、周期
  • 設定低電平翻轉值
  • 使能PWM輸出
  • 啟動PWM
#define PWMx_CR_BASE_ADDR 0xff04
#define PWMx_T1_BASE_ADDR 0xff00
#define PWMx_T2_BASE_ADDR 0xff02
	uint16 match_temp;
	uint16 period_temp; 
	uint8 freq_div = 0;
	
	pwm_set_gpio(pwmch);					//設定為推挽輸出

	
	//清除PWM引腳
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) &= ~(0x03 << 3);
	//切換PWM引腳
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= (pwmch & 0x03) << 3;
	
	freq_div = (sys_clk / freq) >> 15;
	period_temp = sys_clk / freq / (freq_div + 1);				//周期
	match_temp = period_temp * ((float) duty / PWM_DUTY_MAX);	//占空比

	//設定pwmn頻率為 系統時鐘/freq_div
	PWMCKS = freq_div;
	//設定PWMn周期為period_temp個 PWM 時鐘
	PWMC = (uint16)period_temp; 	

	// 在計數值為 match_temp 地方 pwmch 通道輸出低電平
	(*(unsigned int  volatile xdata *)(PWMx_T1_BASE_ADDR + (pwmch & 0xF0))) = (uint16)match_temp;
//	// 在計數值為 match_temp 地方 pwmch 通道輸出高電平
//	(*(unsigned int  volatile xdata *)(PWMx_T2_BASE_ADDR + (pwmch & 0xF0))) = (uint16)0;


	//使能 PWMx 輸出
	(*(unsigned char volatile xdata *)(PWMx_CR_BASE_ADDR + (pwmch & 0xF0))) |= 1 << 7;

	PWMCR = 0x80; // 啟動 PWM 子產品
           

繼續閱讀