用avr如何写程序使直流电机加速减速正转反转

作者&投稿:龚宰 (若有异议请与网页底部的电邮联系)
用单片机控制直流电动机的正反转、加减速的程序如何用C语言写啊~

参考一下这个例子吧。
#include

#define uchar unsigned char
#define uint unsigned int

sbit PW1=P2^0 ;
sbit PW2=P2^1 ; //控制电机的两个输入
sbit accelerate=P2^2 ; //调速按键
sbit stop=P2^3 ; //停止按键
sbit left=P2^4 ; //左转按键
sbit right=P2^5 ; //右转按键


#define right_turn PW1=0;PW2=1 //顺时针转动
#define left_turn PW1=1;PW2=0 //逆向转动
#define end_turn PW1=1;PW2=1 //停转

uint t0=25000,t1=25000; //初始时占空比为50%
uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz
uchar flag=1; //此标志用于选择不同的装载初值
uchar dflag; //左右转标志
uchar count; //用来标志速度档位

void keyscan(); //键盘扫描
void delay(uchar z);
void time_init(); //定时器的初始化
void adjust_speed(); //通过 调整占空比来调整速度
//**********************************//
void main()
{
time_init(); //定时器的初始化
while(1)
{

keyscan(); //不断扫描键盘程序,以便及时作出相应的响应

}
}
//*************************************//
void timer0() interrupt 1 using 0
{

if(flag)
{
flag=0;
end_turn;
a=t0; //t0的大小决定着低电平延续时间
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重装载初值
}
else
{
flag=1; //这个标志起到交替输出高低电平的作用
if(dflag==0)
{
right_turn; //右转
}
else
{
left_turn; //左转
}
a=t1; //t1的大小决定着高电平延续时间
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重装载初值
}

}

void time_init()
{
TMOD=0x01; //工作方式寄存器 软件起动定时器 定时器功能 方式1 定时器0
TH0=(65536-a)/256;
TL0=(65536-a)%256; //装载初值
ET0=1; //开启定时器中断使能
EA=1; // 开启总中断
TR0=0;
}

//****************************************//
void delay(uchar z) //在12M下延时z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//******************************//
void keyscan()
{

if(stop==0)
{
TR0=0; //关闭定时器0 即可停止转动
end_turn;

}
if(left==0)
{
TR0=1;
dflag=1; //转向标志置位则左转
}
if(right==0)
{
TR0=1;
dflag=0; //转向标志复位则右转
}
if(accelerate==0)
{
delay(5) ; //延时消抖
if(accelerate==0)
{
while(accelerate==0) ; //等待松手
count++;
if(count==1)
{
t0=20000;
t1=30000; //占空比为百分之60
}
if(count==2)
{
t0=15000;
t1=35000; //占空比为百分之70
}
if(count==3)
{
t0=10000;
t1=40000; //占空比为百分之80
}
if(count==4)
{
t0=5000;
t1=45000; //占空比为百分之90
}
if(count==5)
{
count=0;
}
}

}
}

参考这个程序,通过PWM调整占空比来调整转速
#include

#define uchar unsigned char
#define uint unsigned int

sbit PW1=P2^0 ;
sbit PW2=P2^1 ; //控制电机的两个输入
sbit accelerate=P2^2 ; //调速按键
sbit stop=P2^3 ; //停止按键
sbit left=P2^4 ; //左转按键
sbit right=P2^5 ; //右转按键


#define right_turn PW1=0;PW2=1 //顺时针转动
#define left_turn PW1=1;PW2=0 //逆向转动
#define end_turn PW1=1;PW2=1 //停转

uint t0=25000,t1=25000; //初始时占空比为50%
uint a=25000; // 设置定时器装载初值 25ms 设定频率为20Hz
uchar flag=1; //此标志用于选择不同的装载初值
uchar dflag; //左右转标志
uchar count; //用来标志速度档位

void keyscan(); //键盘扫描
void delay(uchar z);
void time_init(); //定时器的初始化
void adjust_speed(); //通过 调整占空比来调整速度
//**********************************//
void main()
{
time_init(); //定时器的初始化
while(1)
{

keyscan(); //不断扫描键盘程序,以便及时作出相应的响应

}
}
//*************************************//
void timer0() interrupt 1 using 0
{

if(flag)
{
flag=0;
end_turn;
a=t0; //t0的大小决定着低电平延续时间
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重装载初值
}
else
{
flag=1; //这个标志起到交替输出高低电平的作用
if(dflag==0)
{
right_turn; //右转
}
else
{
left_turn; //左转
}
a=t1; //t1的大小决定着高电平延续时间
TH0=(65536-a)/256;
TL0=(65536-a)%256; //重装载初值
}

}

void time_init()
{
TMOD=0x01; //工作方式寄存器 软件起动定时器 定时器功能 方式1 定时器0
TH0=(65536-a)/256;
TL0=(65536-a)%256; //装载初值
ET0=1; //开启定时器中断使能
EA=1; // 开启总中断
TR0=0;
}

//****************************************//
void delay(uchar z) //在12M下延时z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

//******************************//
void keyscan()
{

if(stop==0)
{
TR0=0; //关闭定时器0 即可停止转动
end_turn;

}
if(left==0)
{
TR0=1;
dflag=1; //转向标志置位则左转
}
if(right==0)
{
TR0=1;
dflag=0; //转向标志复位则右转
}
if(accelerate==0)
{
delay(5) ; //延时消抖
if(accelerate==0)
{
while(accelerate==0) ; //等待松手
count++;
if(count==1)
{
t0=20000;
t1=30000; //占空比为百分之60
}
if(count==2)
{
t0=15000;
t1=35000; //占空比为百分之70
}
if(count==3)
{
t0=10000;
t1=40000; //占空比为百分之80
}
if(count==4)
{
t0=5000;
t1=45000; //占空比为百分之90
}
if(count==5)
{
count=0;
}
}

}
}

AVR 和直流电机间先加个驱动电路,例如典型了L298桥式驱动电路,然后 单片机控制电机两端电流正反就可实现正反转,例如A口的0位和1为分别连接了 直流电机的两端 怎PORTA=0x01 和 PORTA=0x02 分别实现正反转 若要调速则用PWM波控制占空比即可

你这直流电机是直接用单片机IO口驱动的么?那有点小了诶,一般电机都有硬件驱动的啊,程序也是根据硬件来写的。


谁能写个测频率的程序,是用AVR单片机ATXMEGA128A1写的C程序,开发环境...
include <iom16v.h> include <macros.h> define uint unsigned int define uchar unsigned char \/*下面是AVR与LCD连接信息 PA2 ->RS PA3 ->EN 地 ->RW PA4 ->D4 PA5 ->D5 PA6 ->D6 PA7 ->D7 要使用本驱动,改变下面配置信息即可 ---*\/ define LCD_EN_PORT PORTC \/\/...

这段是AVR单片机程序哪位高手指点下
0x80是十六进制数,化成二进制是10000000,与PORTA作或运算,结果是把PORTA里的数最高位置1,后7位不变。(PORTA是一个8位的寄存器,存的是8位二进制数,AVR程序里位运算通常就是这么写的),具体实现什么功能要看你硬件电路上PA7连的是什么了。point_on=~point_on;表示对point_on取反 flash ...

AVR Studio 4 是个什么软件,可以用它编写什么单片机程序?
AVR Studio是烧写仿真软件,进行程序烧写到单片机里面并可进行单步调试等。编写单片机程序一般用ICC或GCC就可以了,编译生成HEX文件供AVR Studio烧录。

avr单片机模拟spi程序 主机给从机传数据,求教下主机和从机的程序
这个spi不用模拟,avr带这个接口,直接用它提供的代码。手册上有。void SPI_MasterInit(void){ \/* 设置MOSI 和SCK 为输出,其他为输入 *\/ DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);\/* 使能SPI 主机模式,设置时钟速率为fck\/16 *\/ SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);} void ...

怎么用AVRISP USB烧程序?
很多初学单片机的都会遇到这样的问题:为什么同一个USBISP和avr最小系统可以正常烧写以前的avr芯片,而新买的芯片为什么就烧写不成功了呢?其实这是因为新的avr芯片熔丝位设置问题,新的芯片熔丝位默认为使用内部1M震荡电路,所以首先要用USBISP的低速模式(软件SPI)把熔丝位修改成使用外部晶振或振荡器电路...

avr编程器烧写程序加密
AVR单片机系列齐全,可适用于各种不同场合的要求。AVR单片机有4个档次:1、低档Tiny系列AVR单片机: 主要有Tiny11\/12\/13\/15\/26\/28等;2、中档AT90S系列AVR 单片机: 主要有AT90S1200\/2313\/8515\/8535等; (正在淘汰或转型到Mega中)3、高档ATmega系列AVR单片机: 主要有ATmega8\/16\/32\/64\/128 4、最新...

求AVR单片机的C语言程序
avr单片机AD有10位,则可以分成1024份,暂假定电位器是线性的,所以3600度分成1024份,每一份就是3.515625度。电位器两端接电源和地,滑动端接ad口即可。

之前我用avr128用avr_fighter烧写程序,用来控制H桥来控制,电机,都可以...
(11)使用支持IAP的AVR芯片时,如果你不使用BOOTLOADER功能,注意不要把熔丝位BOOTRST设置为“0”状态,它会使芯片在上电时不是从Flash的0x0000处开始执行程序。芯片出厂时BOOTRST位的状态默认为“1”。关于BOOTRST的配置以及BOOTLOADER程序的设计与IAP的应用请参考本章相关内容。另外,站长团上有产品团购...

求基于AVR单片机的计数程序
AVR有专门的编译环境,如ICC,AVR Studio,AVR Codevision,GCC等,keil貌似还不支持AVR编译的。貌似你这个问题问的还不太清楚,压力传感器能感受到次数,但是多少次能够断裂,貌似感受不到吧?难道是碎了就检测不到信号?不管怎么说,就以mega16为目标单片机给你写一段啊,只是框架:include<iom16v.h> ...

急求结果 有懂AVR单片机编写的液晶显示程序的请进来指点
你这个液晶屏不是一般开发板能带有的。大致读了一下:include <avr\/io.h> #include "board.h" #include "manage.h"\/\/调用头文件 #include "scan.h" #include "timer.h" #include "lcd.h"void sys_init(void);void bus_reset(void);int main(void) \/\/主程序 { uint8_t i = 0; \/\/...

建邺区13017043135: 用avr如何写程序使直流电机加速减速正转反转 -
相肤补中: AVR 和直流电机间先加个驱动电路,例如典型了L298桥式驱动电路,然后 单片机控制电机两端电流正反就可实现正反转,例如A口的0位和1为分别连接了 直流电机的两端 怎PORTA=0x01 和 PORTA=0x02 分别实现正反转 若要调速则用PWM波控制占空比即可

建邺区13017043135: 求一个AVR单片机控制直流电机运转的程序 -
相肤补中: 写这类程序呢一点要知道硬件原理的.例如直流电机的驱动电路是什么样的是全桥半桥,还是使用专用驱动器.如何控制驱动器,是通过IO口控制,还是使用总线技术与驱动芯片其通信.令些程序前最好明确具体需求,两个电机同步运转是否要控制方向是否需要测速反馈.是否要控制调速等.一个问题一个问题分解应该不难的.具体情况可以继续讨论.个人意见仅供参考,如若有误欢迎批评指正.

建邺区13017043135: 如何用AVR通过pwm控制减速直流电机? -
相肤补中: 不需要AD和DA;但是需要一块像mega16单片机;25块钱一片;用定时器都能实现;但是还是需要有功放;你去搜搜关于脉宽调制的相关内容;要调速,简单的做法就是用定时器,去下载一个mega16单片机的Datasheet http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf 看看就明白了;如何精确的控制速度就麻烦了,因为还和负载大小有关;还得好好计算;

建邺区13017043135: avr单片机直流电机的速度控制问题 -
相肤补中: 当PWM波的占空比为50%时输出地平均电压为零,电机不转但此时电机上是有电的.打个比方就相当于给电机1ms的正向电压,紧接着又加1ms的负向电压,电机正转一会反转一会,总体上是不动的.这个时间要非常小,否则电机就会一直抖动,而且力量不足.当占空比小于50%时,电机反转,值越小速度越快,不会小于0.当占空比大于50%时,电机正转,值越大速度越快,不会小于1.

建邺区13017043135: 用AVR单片机ATmega16产生PWM波来控制直流电机电机运动,求代码和解释,好答案加分,不要从网上乱抄哦 -
相肤补中: 这个还要代码啊,亲,这单片机学的!- -!使用pwm脉宽的原理,比如一个周期内的高电平所占的百分比比较大,也就是说在一定时间内,你给电机上电的时间比较多,更加直观的就是他的实际电流比较大.所以通过设置要一定的周期,调节脉...

建邺区13017043135: 矩阵键盘控制直流电机的程序,只要正反转,是AVR单片机,帮个忙 -
相肤补中: #define uchar unsigned char #define uint unsigned int #include<iom16v.h>#include"ch595.h"#include"encoder.h"#include"key_value.h"#include"disp.h" uchar a1,a2,a3;//键值转换 turn(uchar key) { switch(key) { case 0x11:key=0x01;...

建邺区13017043135: avr单片机直流电机的速度控制问题
相肤补中: 楼上说的是不全面滴!当PWM波的占空比为50%时输出地平均电压为零,电机不转但此时电机上是有电的.打个比方就相当于给电机1ms的正向电压,紧接着又加1ms的负向电压,电机正转一会反转一会,总体上是不动的.这个时间要非常小,否则电机就会一直抖动,而且力量不足. 当占空比小于50%时,电机反转,值越小速度越快,当然不会小于0. 当占空比大于50%时,电机正转,值越大速度越快,当然不会小于1.

建邺区13017043135: 用单片机控制电动机直流调速系统怎么编程序??
相肤补中: 就用PWM控制,输出高电平就是让电机加速,输出低电平电机就减速,控制其PWM波的占空比,就可以控制电机的加速时间与减速时间,这样平均速就可控了.

建邺区13017043135: 单片机电机的编程 -
相肤补中: 直流电机://5级速度可调:0、1、2、3、4; 对应占空比:0、1/4、2/4、3/4、1#includesbit key1=P3^6;sbit key2=P3^7;sbit motor=P1^4;unsigned char PWM_H=0,n=0;void main(){ EA=1; ET0=1; TMOD=0x02; TH1=0x38; TR0=1; while(1) { if(key1...

建邺区13017043135: avr 怎么编写精确的延时程序,用的是winavr -
相肤补中: 1、包含延时头文件:#include <avr/delay.h>2、更改makefile 里面的晶振频率为当前晶振频率3、调用ms延时或则us延时函数: _delay_ms(10); _delay_us(10); 需要注意的是调用延时函数里面的实参并不是随心所欲,虽然形参是float类型的,规定如下:1MHZ晶振时,_delay_ms最大实参为262,_delay_us最大实参为768,因此如果是其他晶振大小的话,要以1MHZ晶振为基础,进行倒数计算,比如4MHZ晶振的话,那么ms延时函数实参最大值只可以填 262 ÷ 4 = 65 ,以此类推.如果要延时时间比较长,且晶振较大的话,那么可以多次调用短时间的延时.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网