STC单片机PWM编程!
看看这个,单片机用的是ADUC848,AD转换输出正弦波,和PWM原理类似。
实验八 D/A转换实验
一、实验目的
1.了解芯片内部D/A转换模块设置方法。
2.了解D/A转换原理。
3. 了解Keil软件中逻辑分析仪的使用方法。
4. 了解用单片机产生正弦信号的基本方法。
二、实验原理
ADuC848中包含一个12位电压输出DAC模块,DAC模块中寄存器的设置如下:
DAC控制寄存器:DACCON
NC表示未定义;
DACPIN为DAC输出引脚选择;
1 = 设置DAC输出引脚为Pin 13 (AINCOM);
0 = 设置DAC输出引脚为Pin 14 (DAC);
DAC8为DAC转换位数模式选择位;
1 = 设置DAC为8位转换;
0 = 设置DAC为12位转换;
DACRN为DAC输出范围选择位;
1 = 设置DAC的输出范围为 0 V – AVDD;
0 = 设置DAC的输出范围为 0 V – 2.5 V (VREF);
DACCLR为DAC清除位;
1 = 设置DAC为正常操作模式;
0 = 复位DAC数据寄存器DACL/H to 0;
DACEN为DAC使能位
1 = 使能DAC转换;
0 = 不使能DAC转换;
DAC数据寄存器:DACH/L
DACH为12位转换的高位数据寄存器
四、程序流程图和源程序
1、主程序流程图
2、源程序清单
DACCON EQU 0xfD ;定义模数转换控制器
DACH EQU 0xfc ;定义模数转换数据寄存器高8位
DACL EQU 0xfb ;定义模数转换数据寄存器低8位
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN:MOV DACCON , #0fH; DAC operation
CLR A ;
MOV DACH , A ;模数转换高八位清零
PRG3:MOVR0,#09H;正弦波
MOVR4,#40H
LP11:MOV A,R0
MOVCA,@A+PC
MOV DACL,A ;2
ACALL DELAY ;2
INCR0;1
DJNZR4,LP11 ;2
SJMP PRG3 ;2
DATA0:
DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H,0DAH,0E2H,0EAH
DB 0F0H,0F6H,0FAH,0FDH,0FFH,0FFH,0FDH,0FAH,0F6H,0F0H
DB 0EAH,0E2H,0DAH, 0D1H,0C7H,0BCH,0B0H,0A5H,98H,8CH
DB 80H, 7FH,73H,67H,5AH,4FH,43H,38H,2EH, 25H,1DH,15H
DB 0FH,09H,05H,02H,00H, 00H,02H,05H,09H,0FH,15H
DB 1DH,25H,2EH,38H,43H,4FH,5AH,67H,73H,7FH
RET
DELAY: MOV R6,#10H
MOV R7,#0A1H
DELAYLOOP: ;延时程序
DJNZ R6,DELAYLOOP
DJNZ R7,DELAYLOOP
RET
END
四、实验板插针配置:
无需插针配置,注意DAC是从CONDACOUT1端子输出,可用示波器观察DAC输出波形。若产生失真情况,请检查开发板DA输出端LM358运算放大器的放大倍数,适当更改所查函数表的范围。
五、思考题
1、改变程序,使能添加输出锯齿波;
2、改变程序,使输出添加三角波;
3、改变程序,使输出添加方波;
4、改变程序,并制作一个简单的函数发生器
AT89C51 单片机L298驱动电机,控制2个12V 直流电机。求PWM 调速的C程序,电路图,电机正反转C程序,流程图
void time0(void) interrupt 1 using 2
{
TR0=0;//停止T0计数
TH0=0xff;//当晶振频率是12M时,每隔0.01ms中断一次,200次中断为PWM信号输出的周期,
TL0=0xf6;//PWM信号的频率=1000/(200*0.01ms)=500HZ
++t_0;//产生一次中断t_0加1
ACC=t_0;//将t_0的值赋值给ACC
CY=0;//清零CY
ACC-=motor_r;//用ACC减去右边电动机的参数(此参数决定了右边电机的转向和速度)
if(CY==1)//判断CY是否置1,如果为1,说明ACC-motor_r已经为负数,置位了CY
{
IN1=1;//IN1由原来的0变成了1
IN2=0;//IN2由原来的1变成了0
goto PWM_2;
}
IN1=0;//如果CY不等于1,IN1=0,IN2=1
IN2=1;
PWM_2:
ACC=t_0;//重新将t_0的值赋值给ACC
CY=0;//清零CY
ACC-=motor_l;//用ACC减去左边电动机的参数(此参数决定了左边电机的转向和速度)
if(CY==1)//判断CY是否置1,如果为1,说明ACC-motor_l已经为负数,置位了CY
{
IN3=1;//IN3由原来的0变成了1
IN4=0;//IN4由原来的1变成了0
goto HIGHT;
}
IN3=0;//如果CY不等于1,IN3=0,IN4=1
IN4=1;
HIGHT:
//ACC=t_0; //重新将t_0的值赋值给ACC
if(t_0!=0xc8)//判断t_0的值是否不等于200
goto EXIT;//如果不等于200,程序指针指向EXIT执行程序
ACC=0;//如果t_0的值等于200,清零ACC和t_0
t_0=ACC;
EXIT:
TR0=1;//打开TO计数
}
如何使用PWM调节小车电机转速?
楼上的我就盗取你的成果了,看这问题,程序最好附上解释就知道您也是初学者了。我来解释下楼上的程序。
PWM 是一个从做功的这么一个说法吧 //PWN脉冲宽度调制
同频率方波 占空比越大(正信号占整个周期信号 时间上的比值) 所做功越大 可以想象了吧
/*就是说,比如你全输出高电平,功率肯定是最大了,一半高一半低,就是中间功率了,全是低电平,功率就最小了。我调节高电平的时长,功率就会变化,说起来很高深,其实也就这么样了
*/
我来写个最简单的 //这真的很简单了
sbit qudong=P*^*
/*都说了要控制电平的高低了,所以至少要一个引脚出来吧,P*^*的意思是,你想哪个脚都行,P0^0,到P4^7,随便你了*/
void delay(unsigned char k)//这个是延时函数
{
unsigned char i;j;
for (i=0;i<k;i++)
for(j=0;j<110;j++);//所谓的延时,因为单片机运行指令要时间,你运行多少个指令,不就过去
//了多少个指令周期过去了么,具体时间是多少,和你的单片机型号和晶
//振有关
}
main() //di第一个
{ qudong=0;//这里拉低电平,关闭电流,作为初始化,你不能一开机机器就转啊转啊,多不好,
while(1)//这里就是程序了,一直运行括号里的东西,直到天荒地老,或者停电。
{ delay(10);//刚刚不是拉低了么,这里延时10,就是低了10的delay的时间过去了。
qudong=1;//现在拉高,后面跟的时间就是高电平的时间了
delay(40);//同理,这里延时40,就是高了40的delay的时间过去了。
qudong=0;//高电平结束,现在又拉低了。
}
//总的来说,这是一个高40,低10的方波,占空比80%。但是有个问题,就是到高电平结束,又拉低了后,会进行一个while(1)的判断,所以不是完整的80%,会有偏差。
当然了 这是个最简单的了 要精确 可以用定时器作为时间延时的函数
//好吧,其实我有一个定时器做延时函数的,但是我不想打字了。。。。上了一天的班,头都是疼的,也不想算计数器初始化的设置参数了,什么TH0 TL0乱七八糟的
void t1(void) interrupt 1 //这就是12M晶振,1秒的定时,时长随便你定,我头疼。
{
TR0=1;//搞个计数器中断
TH0=0x3c;//重新初始化
TL0=0xb0;//这是12M晶振的
timecount++; //中断一次,记个数
)
main()
{
TMOD = 0x01; //选择计数器0的模式
EA=1; // 打开总中断
ET0=1;TR0=1;//开0计时器
TH0=0x3c;//重新初始化
TL0=0xb0;//这是12M晶振的
这里加点代码,
while(1)
{
if(timecount==几)拉高,
else if(timecount==几)拉低。
else if(timecount==几)timecount=0;//丫的,给我重数
}
好心人请告诉我这PWM是怎样实现调光的啊
PWM意思是占空比调节!你上面的程序简单的讲就是通过中断系统定时控制输出!然后主函数实现高低电平的时间控制PWM_ON是亮度函数CYCLE是亮度时间控制!你如果想完全了解上面的程序的意思还是自己好好学习一下单片机编程!再说别人的程序只是参考参考就行了!
用PWM怎么调节直流电机的速度 用两个定时器怎么 写程序?
用PWM输出引脚驱动驱动晶体管或MOSFET, 以脉宽调制的方法实现直流电机工作电压调节,即调节了电机速度. 一般单片机都有PWM功能,不需要使用定时器,用定时器的方法产生PWM既耗费CPU资源,精确度差,速度慢. CPU忙得满头汗执行中断去产生PWM. 而芯片内部的PWM是硬件逻辑部件,你只需初始化好以后,给它一个数值(控制脉冲占空比)即可自动产生PWM波形.
请问pwm如何调节电机速度和转向?
用改变输出PWM波来改变电压,即改变占空比来调速
PWM 220V 调光程序(汇编)
可以用外部中断和定时中断结合来处理 用一个计数器来表示电源相位,把10毫秒分成100等分,100微秒定时中断一次.(可长点或短点) 外部中断做为过零点检测用,一次过零清空一下计数器 要控制相位就是在100微秒的定时中断内根据计数值控制驱动可控硅脉冲 中断内处理程序越短越少,尽量不要在中断内做延时程序.
PWM如何设置
那个参数不用设置,需要你选择自动,PWM自己就会调节了.从你的cpu温度来看,风扇转数是正常的.
STC单片机 PWM.
STC目前的单片机的pwm都是边沿对齐的,无法实现死区功能,做互补pwm没有太大意义.如果非要互补,还真就用反相器好处理,至少软件不用去重复置2次值. 除了STC的单片机,能做互补PWM 输出的单片机还有很多,英飞凌的XC8xx系列(51内核),PIC的,新唐的mini51系列的有很多,不必一棵树上吊死.
请问,Pwm脉宽调制信号是如何产生的?最好带图解释!
这个要详细的回答还比较麻烦.所谓脉宽,其实就是指脉冲的宽度.举个例:我们放一盆水,一直不停的放要1分钟放满,但我为了控制放满的时间,在每一秒的时间里需要开一下,关一下.而这开和关的时间比值就可以认为是脉冲的占空比,开的时间长,相应的关的时间就会缩短(每秒必须完成一次开和关,相当于脉冲的频率).而放满的时间就可以通过这样的方式来调节(相当于控制输出)这样通过调整开和关的时间(脉冲宽度)来调整输出的,就是脉宽调制.