标题:
利用两个单片机定时器做一个固定频率可调占空比的pwm程序
[打印本页]
作者:
colin988
时间:
2020-6-2 10:03
标题:
利用两个单片机定时器做一个固定频率可调占空比的pwm程序
看到我吃灰多年的手工DIY微型钻子,发现不能调速真是硬伤,今天就花点时间来写一个简单的程序,做一个频率固定,占空比可调的PWM, 先简单接一个12V的小灯泡试试,等画pcb板时再完善,程序贴出来,大家看看还有什么地方需要修改的!
下面是效果图:
26e73dc2-c885-4b1a-8b01-b76648bba7dc.gif
(1.22 MB, 下载次数: 70)
下载附件
2020-6-2 10:01 上传
单片机源程序如下:
#include <STC15.H>
#define uchar unsigned char
#define uint unsigned char
typedef unsigned char BYTE;
typedef unsigned int WORD;
#define PWM_OUT P11
#define K1 P12
#define K2 P13
#define K3 P14
#define led P33
uchar fa;
uint t0_v = 0x10;
//初始化T0的函数,51单片机工作频率为11.0592M
void initT0(void)
{
AUXR &= 0x7F; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
// TL0 = t0_v; //设置定时初值
// TH0 = t0_v; //设置定时重载值
TF0 = 0; //清除TF0标志
ET0 = 1;
// TR0 = 1; //定时器0开始计时
}
void Timer2Init(void) //1微秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0x24; //设置定时初值
T2H = 0xF4; //设置定时初值
AUXR |= 0x10; //定时器2开始计时
}
void delay(BYTE num)
{
BYTE i;
WORD j;
for(i=0;i<num;i++)
{
for(j=0;j<1085;j++);
}
}
void main(){
P1M1 &= ~(1 << 1); //P1.1 设置为推挽输出
P1M0 |= (1 << 1);
led = 0;
P3M1 &= 0xf7;
P3M0 |= 0x08;
K1 = K2 = K3=1;
initT0();
Timer2Init();
PWM_OUT = 0;
//ET0=1;
IE2 |= 0x04;
EA =1;
while(1)
{
if(K1==0)
{
delay(5);
if(K1==0 && t0_v!=0xff)
{
t0_v++;
}
}
if(K2==0)
{
delay(5);
if(K2==0 && t0_v!=0x01)
{
t0_v--;
}
}
if(K3==0)
{
delay(10);
if(K3==0)
{
led = ~led;
}
}
if(t0_v==0xff)
{
led = ~led;
}
if(t0_v==0x05)
{
led = ~led;
}
}
}
void timer0_int (void) interrupt 1
{
TR0 = 0;
PWM_OUT =1;
}
void timer2_int (void) interrupt 12
{
TR0 = 0;
TH0 = TL0 =t0_v;
TR0 =1;
PWM_OUT = 0;
}
复制代码
全部资料51hei下载地址:
timer_pwm.rar
(21.28 KB, 下载次数: 27)
2020-6-2 10:02 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
hhh402
时间:
2020-6-18 11:56
PWM是STC单片机标配,没有必要用定时器模拟,对于直流电机调速太简单了,设置一个1ms定时器开中断,在中断程序中:如果要10档:开9ms关1ms、开8ms关2ms、...开1ms关9ms;如果要20档:开19ms关1ms、开18ms关2ms、...开1ms关19ms;几个语句就完成了。这是简化版PWM。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1