gongcsf 发表于 2005-10-28 11:45:26

我想问一下如何用一路PWM信号来控制一个直流电机的转速

我想用一个电位器+ADC+PWM+小直流电机.

用电位器来控制电机的转速.

借此初步了解怎样形成自己想用的PWM信号

jackiezeng 发表于 2005-10-28 13:49:52

简单的很三,改变脉宽就改变转速了三

gongcsf 发表于 2005-10-28 13:55:58

道理我都明白。只是没有头述。

没有谁详细系统的讲一讲吗。

HJJourAVR 发表于 2005-10-28 14:17:04

VR----->10bit ADC(vref=5V)------>set 10bit PWM(OCR值)------->功率管驱动------>电机



VR输出1V电压   ADC=1024*1/5=204.8, OCR1=204 (脉宽20%),电机的转速也接近20%

VR输出4V电压   ADC=1024*4/5=819.2, OCR1=819 (脉宽80%),电机的转速也接近80%

gongcsf 发表于 2005-10-28 15:05:00

我买的是网站的试验板子。就是马老师的那个AVR-51的板。请问能用上面的2003来驱动吗。一个很小的电机。只是为了试验的。

正在看书。先了解再发问。

HJJourAVR 发表于 2005-10-28 15:06:57

2003可以,最好在电机两端反并一个1n5819二极管(1n4001也行)

gongcsf 发表于 2005-10-28 15:13:33

HJJourAVR;

   能不能请你看一下我的那个《〈初学AVR做的ADC数值显示在1602上〉》的贴子。里面有些问题想请教一下。在那个贴子的第7楼。先谢谢了。我基本上只要上班就一直在OURAVR上了。论坛上搞了在线时间多好。那我的积分多高啊。哈哈。
-----此内容被gongcsf于2005-10-28,15:24:03编辑过

HJJourAVR 发表于 2005-10-28 15:24:48

是7楼?

1 主程序必须为一个无限循环。

你的程序其实是运行到了最到地址然后从0x0000再来一遍,所以你不觉得。



2 你这个0b00000000很郁闷,每次都要看手册,很烦的。

干嘛不用 (1<<ADIF) 之类,明确易懂。



3 adc=ADC是没有问题的,C编译器会自动处理16位寄存器的读写。不要自以为

gongcsf 发表于 2005-10-28 15:30:20

干嘛不用 (1<<ADIF) 之类,明确易懂。

因为没有哪本书上面胡介绍这个用法啊。

AVR的书难找啊。我知道你应该也在东莞吧。东莞的图书馆我跑完了。新的旧的。全跑了。AVR的就没有几本书。

(1<<ADIF) 是ADIF右移一位吧。那ADIF本身是多少呢。

HJJourAVR 发表于 2005-10-28 15:39:00

网上的书很多,

还看实物图书馆,old date了

GCCAVR全部都是这样写的



C语言基础



ADIF就是4 跟手册的为定义是一样的

(1<<ADIF) =(1<<4)=0b00010000



ADCSR=(1<<ADIF);          //只是ADIF位 =1,其他=0

ADCSR|=(1<<ADIF);         //只是ADIF位 =1,其他不变

ADCSR&=~(1<<ADIF);      //只是ADIF位 =0,其他不变

while(ADCSR&(1<<ADIF)) ;//等待ADIF位为0,才退出循环,执行下一步



还有,你的TXC,RXC是什么?

while(UCSRA&=TXC)位不能这样操作

gongcsf 发表于 2005-10-28 15:44:34

谢谢HJJ。我先消化一下。哈哈。

TXC RXC 是串口的发送完成及接收完成的标志位啊。

应该是老书上这样写的。可能真的是AVR快了所以我感觉不到错误。

我改成像你上面写的那样吧。

再次感谢





哈哈。我刚学。

gongcsf 发表于 2005-10-28 22:33:06

while(1)

{

while(ADCSR&(1<<ADIF)) ;//等待ADIF位为0,才退出循环,执行下一步

{

程序......

}

}

可否理解为等待ADIF为1,时运行程序,如果ADIF不为1(ADC转换没完成)就一直在while(1)里循环检测ADIF呢.
页: [1]
查看完整版本: 我想问一下如何用一路PWM信号来控制一个直流电机的转速