利用Mega16的T/C1,设计直流电机驱动信号—相位可调的PWM波,驱动直流电机工作。功能要求: 采用4MHz的系统时钟作为T/C1的计数脉冲源,驱动电机的PWM信号的频率是8KHz,通过调整该驱动信号的占空比实现直流电机速度的调整。 在外部中断——INT0引脚接按键,通过一个按键,控制电机4档速度的切换(其中有一档电机基本停止)。根据上面完成下面代码#include <iom16v.h> #include <macros.h> #pragma interrupt_handler ext_int0_isr:2 //定义外部中断0的中断处理函数 int press_flag=0;
时间: 2023-06-16 21:03:19 浏览: 54
首先,我们需要设置T/C1的计数脉冲源为4MHz的系统时钟。这可以通过以下代码实现:
```c
TCCR1B |= (1<<CS10); //设置T/C1的预分频器为1,计数脉冲源为系统时钟
```
接下来,我们需要生成相位可调的PWM波来驱动直流电机。根据题目要求,频率应为8KHz,占空比应根据需要调整。我们可以使用T/C1的比较匹配模式来生成PWM波。具体实现如下:
```c
//设置PWM波的频率为8KHz
TCCR1A |= (1<<WGM11); //设置T/C1为8位相位正确PWM模式
TCCR1B |= (1<<WGM12) | (1<<WGM13);
OCR1A = 49; //设置比较值,产生8KHz的频率
//设置PWM波的占空比
OCR1B = 0; //初始占空比为0
TCCR1A |= (1<<COM1B1); //设置非反转模式,占空比随OCR1B的值增加而增加
```
接下来,我们需要通过按键切换电机的速度。根据题目要求,应当有4档速度,其中一档电机基本停止。我们可以使用外部中断INT0来检测按键的按下,并在中断处理函数中切换速度。具体实现如下:
```c
//设置外部中断INT0
MCUCR |= (1<<ISC01); //设置下降沿触发模式
GICR |= (1<<INT0); //使能外部中断INT0
//定义外部中断INT0的中断处理函数
#pragma interrupt_handler ext_int0_isr:2
void ext_int0_isr(void)
{
//切换速度
press_flag++;
if (press_flag > 3) press_flag = 0;
switch (press_flag)
{
case 0: OCR1B = 0; break; //电机基本停止
case 1: OCR1B = 128; break; //电机速度1
case 2: OCR1B = 192; break; //电机速度2
case 3: OCR1B = 255; break; //电机速度3
}
}
```
最后,我们需要在主函数中初始化并启动程序。完整代码如下:
```c
#include <iom16v.h>
#include <macros.h>
#pragma interrupt_handler ext_int0_isr:2
int press_flag=0;
void main(void)
{
//设置T/C1的计数脉冲源为4MHz的系统时钟
TCCR1B |= (1<<CS10);
//设置PWM波的频率为8KHz
TCCR1A |= (1<<WGM11);
TCCR1B |= (1<<WGM12) | (1<<WGM13);
OCR1A = 49;
//设置PWM波的占空比
OCR1B = 0;
TCCR1A |= (1<<COM1B1);
//设置外部中断INT0
MCUCR |= (1<<ISC01);
GICR |= (1<<INT0);
//启用中断
sei();
//主循环
while(1)
{
//空闲
}
}
//定义外部中断INT0的中断处理函数
void ext_int0_isr(void)
{
//切换速度
press_flag++;
if (press_flag > 3) press_flag = 0;
switch (press_flag)
{
case 0: OCR1B = 0; break; //电机基本停止
case 1: OCR1B = 128; break; //电机速度1
case 2: OCR1B = 192; break; //电机速度2
case 3: OCR1B = 255; break; //电机速度3
}
}
```