TIM_OCInitStructure.OCMode = TIM_OCMODE_TOGGLE//输出比较模式的翻转模式,当CNT计数到CCR1(也就是PWM中设定脉宽的那个)时电平出现一次翻转,并可以配置产生相应的中断DMA等
输出⽐较模式实现PWM输出
(刚开始尝试写博客,如有错误或者不⾜之处欢迎指正)
我⽤的是通⽤定时器TIM3来产⽣的
输出⽐较模式产⽣PWM与直接配置定时器PWM模式相⽐有⼀些优势,最⼤的就是同⼀个定时器的不同通道可以产⽣频率不同的PWM。
个⼈理解:
其实PWM模式输出⽐较模式的⼀个特殊情况,即不去改变频率值,单改变⽐较值从⽽改变占空⽐。
在输出⽐较模式中,需要利⽤中断,不断改变⽐较值,即捕获/⽐较寄存器的值
再给你个思路了,差不多就这模式,#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void isr_t0(void) //定时器T0中断,
sbit SINGAL1=P2^6//两路PWM信号输出端口,
sbit SINGAL2=P2^7
sbit clr=P1^1
int a=100
int b
uchar c=5
uint PWM1
void isr_t0(void) interrupt 1 //定时器实现T0方波输出
{ int k,h,m,n
TH0=0xFF//定时初值0.1ms
TL0=0x9B
PWM1++
b=a/5*c
if(clr==0)
{SINGAL1=0
SIGNAL2=0}
else {
if (PWM1<=b)//a=10,初始频率为50Hz,
{ SINGAL1=0
SINGAL2=1}
else if ((PWM1>b)&&(PWM1<2*a))
{SINGAL1=1
SINGAL2=0}
else (PWM1=2*a)
{PWM1=0} }}
void main(void)
{
TMOD=0x01
TH0=0xFF
TL0=0x9B
PWM1=0
EA=1 //CPU中断总允许位,
ET0=1//定时器计数器T0中断允许位,
ET1=1//定时器计数器T1中断允许位
TR0=1 //启动定时器T0,
while(1) //无限循环,
{}
}
程序不完全正确,但思路就这个思路,只修改少许就实现了,你说的对P1.1清零,我理解为P1.1对输出波清0
unsigned char bdata Bitssbit bit = Bits^0//定义1个位变量
unsigned char T5S定义1个5秒计时变量
void main(void)
{
bit = 0//位变量清0
T5S = 0xxx//赋5秒倒计数初值
egine = 0关闭电机
agine = 0
EA=1//开启中断程序(into) //开段序
ET0=1//开启T0中断程序(into) //中程
TR0=1 //打开T0中断
while(1)
{
if(!ET0)//如果5秒计时结束
{
delay()//调用1个1秒的循环延时,电机停1秒
T5S = 0xxx//重新赋初值
ET0 = 1//重新开放T0中断
}
}
}
void into(void) interrupt 1
{
T5S--
if(!T5S){bit = ~bitET0 = 0}//取反位变量,关闭T0中断
whole--
last--
if(whole==0)
{whole=7
last=2
if(!bit)//判断位变量决定电机转动方向
{
egine =1//电机正转
agine = 0
}
else
(
agine = 1//电极反转
egine =0
}
}
else
{if(last==0)
{
egine =0
agine = 0
}
}
TH0 = 0x0FF
TL0 = 0x9C
}
delay()//1秒延时子程序
{
.........
}
以上修改的程序供参考,5秒和1秒的定时参数涉及单片机时钟频率,你自己解决,希望能帮到你。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)