
請自行定義部分內容
要直接編譯 還需要加一些定義,如包含頭文件,增加類型定義。
typedef unsigned char uint8;
typedef unsigned int uint16;
[code="c"]
#define F_CPU_M   7.3728
#define DDR_OC1   DDRB
#define PORT_OC1A PB1
#define PORT_OC1B PB2
#define CKDIV_0      0
#define CKDIV_1      1
#define CKDIV_8      2
#define CKDIV_64     3
#define CKDIV_256    4
#define CKDIV_1024   5
//Time=PRE*(MAX-TCNT0+1) /F_cpu 這里time以秒為單位 F_cpu以hz為單位
//Time*F_cpu=PRE*MAX
//Max=Time*F_cpu/pre;
//2us ~ 65000us (65ms)
void pwmIint_us(uint16 zhouqi_us,uint16 high_us_A,uint16 high_us_B)
{
 uint8 ckdiv = 1; //預分頻
 float tmp;
 
 if((float)zhouqi_us>(float)(65536/F_CPU_M))
 {
  TCCR1B=CKDIV_8;//控制預分頻
  ckdiv = 8;
 }
 else
 {
  TCCR1B=CKDIV_1;//控制預分頻
 }
 
 tmp=F_CPU_M*(float)(zhouqi_us/ckdiv);
 ICR1 =  (uint16)tmp; //控制最高計數
 if(high_us_A)
 {
  DDR_OC1|=(1<<PORT_OC1A); //對應引腳為輸出
  TCCR1A |=(1<<COM1A1);    //比較匹配時清零
  tmp=F_CPU_M*(float)(high_us_A/ckdiv);
  OCR1A=(uint16)tmp;
 }
 if(high_us_B)
 {
  DDR_OC1|=(1<<PORT_OC1B);
  TCCR1A |=(1<<COM1B1);
  tmp=F_CPU_M*(float)(high_us_B/ckdiv);
  OCR1B=(uint16)tmp;
 }
 TCCR1A |=(1<<WGM11);  //WGM 11 12 13 組合表示 快速PWM模式 計數TOP 為ICR1
 TCCR1B |=((1<<WGM13)|(1<<WGM12));
}
[/code]
pwmIint_us(200,100,0);的效果如圖
 
pwmIint_us(65000,32500,0); 的效果
 