佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1689|回复: 20

PIC16F877a (40pin) (控制DC Motor 速度)

[复制链接]
发表于 29-9-2008 10:16 PM | 显示全部楼层 |阅读模式
请问谁会PIC16F877a 的C Programming?
我要用它来控制motor 的speed.
请问谁会写他的code?
谢谢。

[ 本帖最后由 pic 于 4-10-2008 08:25 AM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 30-9-2008 09:12 AM | 显示全部楼层
原帖由 东邪西毒 于 29-9-2008 10:16 PM 发表
请问谁会PIC16F877a 的C Programming?
我要用它来控制motor 的speed.
请问谁会写他的code?
谢谢。

嗯。。。这里有很多人会你要做的东西, 但是不会有人给你现成的答案。
你说控制motor, 是什么motor呢?
如是普通的DC motor, 你可以用PWM 来控制。

希望你努力google找找看, 你遇到问题再回来问。
也请参考版规看看, 设法“一次过”说清楚, 不要问一句, 答一句。
回复

使用道具 举报

 楼主| 发表于 30-9-2008 02:19 PM | 显示全部楼层
谢谢,google 我是找到不要再找了。
我是用DC motor 和 8 bit-Digital-Analog Converter,
mean 0-5v is cut into 256 pieces。

max speed (1111 1111) 是 5V,
min speed (0000 0000)是 0V.

我曾问过老师,他们都说上网找,用pwm 的办法是找的,就是读了又读,还是不明白,所以就来论坛。

我曾找到以下的code,但就是不知要改哪一个变数来控制speed。请各位指点。

#include "Motor.h"

long ADCValue=0;
long ADCValueOld=1;

#byte portA = 0X05
#byte portB = 0X06
#byte portC = 0X07

void main()
{
set_tris_A(0b00101011);
set_tris_B(0b00000001);
set_tris_C(0b00000000);

portA=0X00;
portB=0X00;
portC=0X00;

setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,WDT_288MS);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DIV_BY_1,255,1);
setup_ccp1(CCP_OFF);
setup_ccp2(CCP_PWM);
enable_interrupts(global);

set_adc_channel(0);
delay_us(10);

while(1)
{
ADCValue = Read_ADC();
delay_ms(100); // monitor 10 times a second

if ( ADCValue != ADCValueOld )
{
set_pwm2_duty(ADCValue);
ADCValueOld = ADCValue;
}
}
}
回复

使用道具 举报

发表于 30-9-2008 05:49 PM | 显示全部楼层
原帖由 东邪西毒 于 30-9-2008 02:19 PM 发表
谢谢,google 我是找到不要再找了。
我是用DC motor 和 8 bit-Digital-Analog Converter,
mean 0-5v is cut into 256 pieces。

max speed (1111 1111) 是 5V,
min speed (0000 0000)是 0V.

我曾问过老师 ...


根据你的说法,
你的 DAC 是直接出电压去驱动(output of DAC connected to DC Motor) 的吗?
如是,你的问题就非常容易解决,

只要在一个时段内(DAC conversion time) send 一次去其中一个 port, 就可以了。
完全不用PWM.
回复

使用道具 举报

发表于 30-9-2008 07:44 PM | 显示全部楼层
pwm 是用duty cycle 来control,不需要DAC,可能需要 driver
用 port ++/port -- 就能换 port 的output
回复

使用道具 举报

 楼主| 发表于 30-9-2008 09:31 PM | 显示全部楼层

回复 4# mwl_86 的帖子

对,output of DAC connected to DC Motor!
请问我的code 中有pwm 的地方如何改?
回复

使用道具 举报

Follow Us
发表于 30-9-2008 09:46 PM | 显示全部楼层
原帖由 东邪西毒 于 30-9-2008 09:31 PM 发表
对,output of DAC connected to DC Motor!
请问我的code 中有pwm 的地方如何改?
不是 DAC是 ADC
你的code 是 analogue input ,直接去mcu,compare 后就output pwm

set_pwm2_duty(ADCValue);

什么叫做如何改?
改成什么?

[ 本帖最后由 sushi-x 于 30-9-2008 10:23 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 30-9-2008 10:25 PM | 显示全部楼层

回复 7# sushi-x 的帖子

吓!
我会apply 5V to 8-bit DAC, mean 5V cut into 256 pieces, 1 piece is about 0.02V

如果我要在首3 seconds给motor 0.32V,就把input 0000 1111 to DAC。
如果我要在另3 seconds给motor 2.5V(half of max Voltage),就把input 1000 0000 to DAC。
如果我要在另3 seconds给motor 3.42V,就把input 1010 1010 to DAC。

then, digital will convert to analog to control the motor speed.

所以,用DAC很合理啊。。。
回复

使用道具 举报


ADVERTISEMENT

发表于 1-10-2008 07:14 AM | 显示全部楼层
第一:你给的code是 Analogue input PWM output,不是 digital output
第二:请声明你要用digital output 还是 pwm output,input 是 digital 还是analogue
第三:请声明什么类型的motor,servo,stepper之类
第四:如果要digital output就很简单,去google参考和了解一些input output的application。

我只会avr,不知道CCS或PIC的asm。
回复

使用道具 举报

发表于 1-10-2008 09:23 AM | 显示全部楼层
楼主, 请问你的应用是什么?
现在, 只知道你要控制DC motor。
然后, 你的DC Motor 又是做什么呢?你介意说清楚?
你的motor 是做风车?你的motor 完全没有负载(load)?
或是小车之类, 有一定的负载(load)重量?
或你用的5V DC Motor的torque是很强很强的?

为什么我非常的强调, 一次一次不厌其烦的问是什么应用(Application)?
因为不同的应用(application), 有时会用不同的手段或方法。


楼主简单的说是控制motor 的速度, 完全没有考虑负载的问题?可能是因为不理解, 没有这个知识。
现在我来说一下, 你的方法会遇到的问题。

如果我要在首3 seconds给motor 0.32V,就把input 0000 1111 to DAC。
如果我要在另3 seconds给motor 2.5V(half of max Voltage),就把input 1000 0000 to DAC。
如果我要在另3 seconds给motor 3.42V,就把input 1010 1010 to DAC。

你的理论是绝对正确的, 如果没有负载, 如果motor 是完美的(ideal), 扭力超强的Motor。

但如果有负载(load)的情况下, 0.32V 能不能启动motor?Motor可能不会动~!
然后你被逼要增加Voltage来启动Motor, 好了, 这时Motor 启动了, 但速度太快了,你又要把voltage 调小。。

还有假设2.5V时motor的转速是1000RPM, 有负载的时候还能维持1000RPM吗?

我们不知道楼主的Motor 转速是不是很重要, 因为我们不懂楼主要做的是什么(应用)。
我们假设楼主不理Motor的转速, 那他可以用DAC的方式, 用电压来控制速度, 没有错。

事实上, 要控制DC motor的速度, 最常用, 最简单的就是PWM的方法。
用PWM的电路也最简单, 只是用一颗Transistor或MOSFET就可以了, transistor/mosfet 在 fully turn on的情况下, 损耗最小, 不会发高热。
但如果是用电压控制, 当是2.5V时, 表示 2.5v 给Motor, 另2.5V Transistor或MOSFET 要承受, 变成热浪费, 然后你要放heatsink。

PWM 是控制On/Off的时间。(duty on/off), (google PWM 如果不明白PWM是什么。)
如果你的是5V的motor,你要慢速启动,  启动的电压是5V开始, 只是On的时间较短, 然后就Off了。
Motor是用5V 启动, 比起用0.32V启动有力多多咯。。。楼主你说对吗?
set_pwm_duty(0b00001111);

set_pwm_duty(0b10000000); // 半速
set_pwm_duty(0b11111111); // 全速

好了,先停一停吧。。。等搞清楚楼主的应用后再继续。
希望网友以后发帖可以把应用说清楚。

看来, 要有一点鼓励,奖励。。。
如有在一开帖就把应用说清楚的网友, 就有加+20分。
那么会有手印在标题上, 表示这个帖是值得一看?
回复

使用道具 举报

 楼主| 发表于 1-10-2008 03:46 PM | 显示全部楼层

回复 10# pic 的帖子

应用是。。。
我要设计一个robot, auto robot, means when turn on, it will run and stop base on code.

我用dual motor drive 来控制两个轮(1左 1右)
如果是走直线,自然不用control speed 这东西。
我要让我的robot能转弯。如:要转左,就放慢左轮的速度。

由于是刚开始学, 我的load 就只有circiut board, 大概300g吧,对motor 的影响应该不大吧。
回复

使用道具 举报

发表于 1-10-2008 04:07 PM | 显示全部楼层
原帖由 东邪西毒 于 1-10-2008 03:46 PM 发表
应用是。。。
我要设计一个robot, auto robot, means when turn on, it will run and stop base on code.

我用dual motor drive 来控制两个轮(1左 1右)
如果是走直线,自然不用control speed 这东西。
我 ...

终于理解了。。。
建议你用两个Software PWM 来控制。。
如果你要用之前DAC的方法, 我也不反对, 因为你会学到更多东西。
回复

使用道具 举报

 楼主| 发表于 1-10-2008 04:13 PM | 显示全部楼层

回复 9# sushi-x 的帖子

以上的code, 我只是当作参考,不要误会。

版主,我要我的robot 在固定的时间内,自行控制左轮或右轮的速度。我会用9V的电池启动。所以我可以说我要digital input, analog output,对吗?

刚想到,load 也包括9V电池。

[ 本帖最后由 东邪西毒 于 1-10-2008 04:15 PM 编辑 ]
回复

使用道具 举报

发表于 1-10-2008 06:22 PM | 显示全部楼层
原帖由 东邪西毒 于 1-10-2008 04:13 PM 发表
版主,我要我的robot 在固定的时间内,自行控制左轮或右轮的速度。我会用9V的电池启动。所以我可以说我要digital input, analog

如果真的只是单纯的在固定的时间内,自行控制左轮或右轮的速度, 那只要有两个Digital output 做成的PWM就够了。
那为什么还要input呢?

MCU可以用PIC16F628A。
你的Motor 是5V的还是9V的?是大是小?确定够推动你的load吗?
建议不要去用什么7805把电弄小然后供给motor用, 可以考虑直接用3粒~4粒1.5VAA/AAA电池。
回复

使用道具 举报

 楼主| 发表于 1-10-2008 08:36 PM | 显示全部楼层
大约明白了,dc motor 的款式还在和朋友争议当中,只是code那边还不是很会改写。
谢谢大家,有问题再来问。
回复

使用道具 举报

发表于 2-10-2008 09:19 AM | 显示全部楼层
原帖由 东邪西毒 于 1-10-2008 08:36 PM 发表
大约明白了,dc motor 的款式还在和朋友争议当中,只是code那边还不是很会改写。
谢谢大家,有问题再来问。

编程Coding是不会困难, 你爬旧帖可以看到我之前发的Software PWM ,CCS C code。

反而是机械的部分, 你的robot会不会走直线 , 这个还要花一点心机。

记得KFC在多年前有推出一个小玩具车, 你可以program它要怎么走, 左转, 右转, 向前, 停止等等复杂动作, 还会发出音效。
那个玩具车的样子很像Kembara, 不知大家还有印象吗?呵呵~
回复

使用道具 举报


ADVERTISEMENT

发表于 2-10-2008 12:57 PM | 显示全部楼层
原帖由 东邪西毒 于 30-9-2008 10:25 PM 发表
吓!
我会apply 5V to 8-bit DAC, mean 5V cut into 256 pieces, 1 piece is about 0.02V

如果我要在首3 seconds给motor 0.32V,就把input 0000 1111 to DAC。
如果我要在另3 seconds给motor 2.5V(half of max V ...


dac通常只是supply reference voltage.也既是说, supply current不足够来drive一个motor. (除非你的motor draw < 1ma的电,还是你的DAC output current很高, 基本上我没看过这种dac.)

所以用pwm是最简单的方法。一直adjust他的duty cycle就可以了。
回复

使用道具 举报

发表于 2-10-2008 12:58 PM | 显示全部楼层
原帖由 pic 于 2-10-2008 09:19 AM 发表

编程Coding是不会困难, 你爬旧帖可以看到我之前发的Software PWM ,CCS C code。

反而是机械的部分, 你的robot会不会走直线 , 这个还要花一点心机。

记得KFC在多年前有推出一个小玩具车, 你可以program它 ...


没这个印象, 不过lego mindstorm也是类似的产品。 很贵一下。
回复

使用道具 举报

发表于 2-10-2008 10:18 PM | 显示全部楼层
原帖由 fritlizt 于 2-10-2008 12:58 PM 发表
没这个印象, 不过lego mindstorm也是类似的产品。 很贵一下。


终于找到这辆可编程的KFC 玩具车了, 还有, 不要小看它, 它可是有US Patent 的哦。。。








回复

使用道具 举报

 楼主| 发表于 7-10-2008 06:11 PM | 显示全部楼层
请问那kfc 的车,也是用pic来program吗?

再问谁有pic16f877的中文C language参考书?能否卖给我?
我爬过贴了,大都答非所问。
所以我再问。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 28-12-2024 10:38 PM , Processed in 0.136315 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表