登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
AVR单片机论坛
›
小型直流电机控制例子
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
小型直流电机控制例子
[复制链接]
4281
1
慧***
超级版主
发表于 2010-5-26 00:04:05
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
初学
AVR
,手头没有什么具体实践的课题,拆了几个小马达,玩玩中,也学到不少东西。希望可以给初学着一点帮助。
这个小型的直流电机控制系统很容易就可以实现,采用PWM调速方式,驱动电路,可以用分立元件搭,(网上这种电路很多),也可以采用集成IC器件,我采用的就是L293。电路很简单,就不画图了。
接线描述如下:
PORTC7,PORTC6分别接L293 IN1,IN2,察看L293资料可知,ENA=H,IN1=H,IN2=L正转
ENA=H,IN1=L,IN2=H反转
ENA=H,同IN2(IN4),同IN1(IN3) 快速停止
ENA=L, 停止
OCR2接L293 ENA
测速反馈信号接T0
代码描述如下:
本系统可以同过串口接收上位机控制命令,可以实现开启,停机,调速,及时速度反馈。串口采用接收中断方式,命令协议如下:命令采用M**C模式,所有命令字符串以M开头,C结尾。中间两个字符定义:s表示调速,以第三个命令字符和0xff的比值作为PWM的占空比进行调速。
d表示向上位机发送当前转速。
t表示停机
r表示开启
o表示方向翻转
测速采用测速脉冲信号(霍尔速度传感器)作为T2的外部计数脉冲,T1 CTC模式,实现1s定时,比较匹配中断允许,中断服务程序读TCNT2的值,即为转速,读后重新初始化Timer2。
对初学者来说,测速可以使用cpu风扇来作试验,cpu风扇自带一个速度输出线,内部采用的是霍尔传感器,注意,霍尔传感器输出端是oc门开路,需要接上拉电阻。可以得到很标准的方波!另:注意将风扇接地和你的开发板接地连在一起。
原代码如下:
程序采用的是ICC自动生成代码,再移植到codevision中,本人觉得ICC自动生成代码结构清晰,很适合初学者,也可能有不妥的地方!
// Target : M16
// Crystal: 4.0000Mhz
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
unsigned char rx_data[5];//数据缓冲区
volatile unsigned char rx_counter=0;
volatile unsigned char crut_sped;//当前转速
//const unsigned char seg_table[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
//0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0b01000000; //m103 output only
DDRC = 0xFF;
PORTD = 0xFF;
DDRD = 0xFF;
}
//外部事件计数
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x00;
OCR0 = 0x00 ;
TCCR0 = 0x07; //start
}
//TIMER1 initialize - prescale:64
// WGM: 4) CTC, TOP=OCRnA
// desired value: 1Sec
// actual value: 1.000Sec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x0B; //setup
TCNT1L = 0xDD;
OCR1AH = 0xF4;
OCR1AL = 0x23;
OCR1BH = 0xF4;
OCR1BL = 0x23;
ICR1H = 0xF4;
ICR1L = 0x23;
TCCR1A = 0b00000000;
TCCR1B = 0b00001011; //start Timer
}
//TIMER2 initialize - prescale:64
// WGM: PWM Phase correct
// desired value: 122Hz
// actual value: 122.549Hz (0.4%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
TCNT2 = 0x01; //set count
OCR2 = 0x3f; //set compare
TCCR2 = 0b01100011; //start timer
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
//compare occured TCNT3=OCR3A
crut_sped=TCNT0;
timer0_init();
}
//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19231 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;
UBRRL = 0x0C; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}
interrupt[USART_RXC] void uart_rx_isr(void)
{
/*if (rx_counter >= 4)
{
rx_counter = 0;
if ((!(rx_data[0] == 'M'))||(!(rx_data[3] == 'C')))
{
rx_data[0]=0;
rx_data[1]=0;
rx_data[2]=0;
rx_data[3]=0;
}
} */
rx_data[rx_counter] = UDR;
if (rx_data[rx_counter]=='M')
{
rx_data[0]=rx_data[rx_counter];
rx_counter=0;
}
rx_counter++;
}
void init_devices(void)
{
//stop errant interrupts until set up
#asm("cli"); //disable all interrupts
port_init();
timer0_init();
timer1_init();
timer2_init();
uart_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0b00010000; //输出比较匹配A中断使能
#asm("sei");//re-enable interrupts
//all peripherals are now initialized
}
void timer2_reset(unsigned char i)
{
if((i>0x00)&&(i<0xff))
{
TCCR2 = 0x00; //stop
TCNT2 = 0x01; //set count
OCR2 = i; //set compare
TCCR2 = 0b01100011; //start timer
}
}
void speed_direction(void)
{
PORTC^=0x80;
PORTC^=0x40;
}
void main(void)
{
init_devices();
while(1)
{
if (rx_counter==4)
{
rx_counter=0;
if ((rx_data[0] == 'M')&&(rx_data[3] == 'C'))
{
if(rx_data[1]=='s')//设定速度
{
timer2_reset(rx_data[2]);
}
else if(rx_data[1]=='d')
{
putchar(crut_sped);
}
else if(rx_data[1]=='t')
{
PORTC=0x00;
}
else if(rx_data[1]=='r')
{
PORTC=0x80;
}
else if(rx_data[1]=='o')
{
speed_direction();
}
}
else
{
printf("your command is wrong
");
}
rx_data[0]=0;
rx_data[1]=0;
rx_data[2]=0;
rx_data[3]=0;
}
}
}
复制代码
举报
回复
1 个评论
jiuha***
新手上路
发表于 2016-5-12 16:44:06
|
显示全部楼层
要是有个电路图截图就更好了,小白很懒
举报
回复
支持
反对
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
为什么电动车会着火?原因是什么?电动车充
其实电动车起火的新闻我们也不是第一次看到了,让很多人对电动车的安全性产生质疑,但
性价比超高的国产单片机了解一下
hello大家好,我是无锡矽杰微电子的马甲小号 今天给大家介绍一颗单片机,我们的
上手简单,开发资料齐全的触摸单片机了解一
hello,各位工程师大大们新年快乐 我是无锡矽杰微电子的马甲号。 我司新推出了
国产单片机推荐XC8P9530 可广泛应用于 电量
位工程师朋友们,大家好,我是无锡矽杰微电子的马甲小号 给大家介绍一款我们23年底新
单元测试/集成测试自动化工具
CoverageMaster winAMS : 适用于嵌入式目标机代码的单元测试/集成测试工具 全面支
更多
精华推荐
适用于电子鞭炮、电子蜡烛灯等方案的单片机
为什么电动车会着火?原因是什么?电动车充
性价比超高的国产单片机了解一下
国产单片机推荐I 低功耗、强驱动、极具性价
上手简单,开发资料齐全的触摸单片机了解一
国产单片机推荐XC8P9530 可广泛应用于 电量
单元测试/集成测试自动化工具
PY32L020单片机,超低功耗,多种低功耗模式
更多
社区学堂
为什么电动车会着火?原因是什么?电动
性价比超高的国产单片机了解一下
为什么电动车会着火?原因是什么?电动车充
其实电动车起火的新闻我们也不是第一次看到了,让很多人对电动车的安全性产生质疑,但
性价比超高的国产单片机了解一下
hello大家好,我是无锡矽杰微电子的马甲小号 今天给大家介绍一颗单片机,我们的
上手简单,开发资料齐全的触摸单片机了解一
hello,各位工程师大大们新年快乐 我是无锡矽杰微电子的马甲号。 我司新推出了
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表