永发信息网

单片机控制8路pwm波并且每路要多个脉冲

答案:4  悬赏:70  手机版
解决时间 2021-03-29 17:52
  • 提问者网友:我的未来我做主
  • 2021-03-29 08:43
单片机控制8路pwm波并且每路要多个脉冲
最佳答案
  • 五星知识达人网友:青灯有味
  • 2021-03-29 10:05
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Cycle 20000 //定义周期
uint PWM_Value[6];
uchar order=0; //中断步长

sbit PWM_OUT0=P0^0; //舵机1
sbit PWM_OUT1=P0^1; //舵机2
sbit PWM_OUT2=P0^2; //舵机3
sbit PWM_OUT3=P0^3; //舵机4
sbit PWM_OUT4=P0^4; //舵机5
sbit PWM_OUT5=P0^5; //舵机6

void Init_Timer0() //定时器0 初始化
{
TMOD=0x01;

TH0=(65536-500)/256; //0.5ms TL0=(65536-500)%256;
AUXR&=0x7F; //12分频 1T模式
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1;//启动定时器0

// PT0=1; //定时器0 设置为最高优先中断
// PX0=0; // 外部中断0 设置最低中断
}

void timer0(void) interrupt 1
{
switch(order)
{
case 1:PWM_OUT0=1;
TH0=-PWM_Value[0]/256; //第一路输出高电平时长
TL0=-PWM_Value[0]%256;
break;
case 2:PWM_OUT0=0;
TH0=-(5000-PWM_Value[0])/256; //第一路 输出低电平时长
TL0=-(5000-PWM_Value[0])%256;
break;
case 3:PWM_OUT1=1;
TH0=-PWM_Value[1]/256;
TL0=-PWM_Value[1]%256;
break;
case 4:PWM_OUT1=0;
TH0=-(5000-PWM_Value[1])/256;
TL0=-(5000-PWM_Value[1])%256;
break;
case 5:PWM_OUT2=1;
TH0=-PWM_Value[2]/256;
TL0=-PWM_Value[2]%256;
break;
case 6:PWM_OUT2=0;
TH0=-(5000-PWM_Value[2])/256;
TL0=-(5000-PWM_Value[2])%256;
break;
case 7:PWM_OUT3=1;
TH0=-PWM_Value[3]/256;
TL0=-PWM_Value[3]%256;
break;
case 8:PWM_OUT3=0;
TH0=-(5000-PWM_Value[3])/256;
TL0=-(5000-PWM_Value[3])%256;
break;
case 9:PWM_OUT4=1;
TH0=-PWM_Value[4]/256;
TL0=-PWM_Value[4]%256;
break;
case 10:PWM_OUT4=0;
TH0=-(5000-PWM_Value[4])/256;
TL0=-(5000-PWM_Value[4])%256;


order=0;
break;

default: order=0;
}
order++;
}

这是6路德 你照着加两路就行了,脉宽可以连续可调
全部回答
  • 1楼网友:一把行者刀
  • 2021-03-29 11:45
只要频率不是太高,单片机有多少个引脚就输出多少路都是可以的,具体到脉冲的个数也是可以的。
思路就是定时器中断,对每一路计数高低电平时间时间切换,统计脉冲个数。
  • 2楼网友:想偏头吻你
  • 2021-03-29 11:26
PWM波频率不高要求高可软件扫描实现。
P1.0----P1.7 PWM脉冲输出脚
R0-----R7 控制脉冲占空比
子程序: mov p1 #0ffh // P1.0----P1.7输出PWM脉冲
mov a #0
aa: inc a
cjne a,r0,转到下个比较 //判断第1路占空比
clr p1.0
-------- //判断第n路占空比
cjne a,r7, bb //判断第8路占空比
clr p1.7
bb: cjne a,#255, aa //判断第8路占空比
跳出子程序
自己编程调R0--R7控制脉宽。
  • 3楼网友:末日狂欢
  • 2021-03-29 10:51
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Cycle 20000 //定义周期
uint PWM_Value[6];
uchar order=0; //中断步长

sbit PWM_OUT0=P0^0; //舵机1
sbit PWM_OUT1=P0^1; //舵机2
sbit PWM_OUT2=P0^2; //舵机3
sbit PWM_OUT3=P0^3; //舵机4
sbit PWM_OUT4=P0^4; //舵机5
sbit PWM_OUT5=P0^5; //舵机6
void Init_Timer0() //定时器0 初始化
{
TMOD=0x01;
TH0=(65536-500)/256; //0.5ms TL0=(65536-500)%256;
AUXR&=0x7F; //12分频 1T模式
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1;//启动定时器0

// PT0=1; //定时器0 设置为最高优先中断
// PX0=0; // 外部中断0 设置最低中断
}
void timer0(void) interrupt 1
{
switch(order)
{
case 1:PWM_OUT0=1;
TH0=-PWM_Value[0]/256; //第一路输出高电平时长
TL0=-PWM_Value[0]%256;
break;
case 2:PWM_OUT0=0;
TH0=-(5000-PWM_Value[0])/256; //第一路 输出低电平时长
TL0=-(5000-PWM_Value[0])%256;
break;
case 3:PWM_OUT1=1;
TH0=-PWM_Value[1]/256;
TL0=-PWM_Value[1]%256;
break;
case 4:PWM_OUT1=0;
TH0=-(5000-PWM_Value[1])/256;
TL0=-(5000-PWM_Value[1])%256;
break;
case 5:PWM_OUT2=1;
TH0=-PWM_Value[2]/256;
TL0=-PWM_Value[2]%256;
break;
case 6:PWM_OUT2=0;
TH0=-(5000-PWM_Value[2])/256;
TL0=-(5000-PWM_Value[2])%256;
break;
case 7:PWM_OUT3=1;
TH0=-PWM_Value[3]/256;
TL0=-PWM_Value[3]%256;
break;
case 8:PWM_OUT3=0;
TH0=-(5000-PWM_Value[3])/256;
TL0=-(5000-PWM_Value[3])%256;
break;
case 9:PWM_OUT4=1;
TH0=-PWM_Value[4]/256;
TL0=-PWM_Value[4]%256;
break;
case 10:PWM_OUT4=0;
TH0=-(5000-PWM_Value[4])/256;
TL0=-(5000-PWM_Value[4])%256;


order=0;
break;
default: order=0;
}
order++;
}
这是6路德 你照着加两路就行了,脉宽可以连续可调
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯