AVR ATtiny13A AD采样控制PWM(AtmelStudio 7)

2 篇文章 0 订阅
/*
 * ATtiny13A.c
 *通过测量外部的0-3V电压控制PWM输出占空比,频率2KHZ
 * Created: 2021/12/9 20:57:11
 * Author : JIA
 */ 

#include <avr/io.h>
#define F_CPU  4800000UL		//在延时文件前定义
#include <util/delay.h>
//#include <avr/interrupt.h>

#define uchar unsigned char
#define  uint unsigned int

#define LED0  PORTB &= ~(1 << PORTB3)
#define LED1  PORTB |= (1 << PORTB3)

void init(void)		//初始化函数
{
	/*******  IO端口配置 ******/
	DDRB |= (1 << DDB3) | (1 << DDB0) | (1 << DDB1);		//定义输出端口:PB3临时指示灯,PB0-PWM; PB1-STOP(0);
	DDRB &= ~((1 << DDB4) | (1 << DDB2));		//定义输入端口:PB4-过载信号监测;PB2-采样信号模拟量输入
	
	PORTB |= (1 << PORTB0);			//初始化启动风扇停转
	PORTB &= ~((1 << PORTB1) | (1 << PORTB3));		//STOP信号初始化为0;点亮指示灯
	
	/*********  ADC 模数转换配置  ***********/
	ADMUX |= (1 << MUX0);	//VCC作为参考电压,采用右对齐,ADC1(PB2)通道 (REFS0片内1.1V基准)
	ADCSRA |= (1 << ADEN) | (1 << ADSC) | (1 << ADPS2) |  (1 << ADPS0) |(1 <<ADATE);		//(ADATE)连续转换,注意这个值,不允许中断,32分频
	ADCSRB = 0X00;
	/********  快速PWM配置 ******/
	TCCR0A |=  (1 << WGM01) | (1 << WGM00) | (1 << COM0A1) | (1 << COM0A0);	//快速PWM,PB4引脚,TCNT0与OCR0A匹配时,输出高电平	(后期改为高电平计数置顶输出高电平
	TCCR0B |= (1 << CS01);		//时钟8分频,2.4KHZ																		
	OCR0A = 0x38;		//15%占空比
	TCNT0 = 0x00;
	
}


/******	转换结果 调整占空比 *******/
void ADC_Convert(void)
{
	unsigned long temp = 0 ;
	uint adc_v;
	temp =ADC;
	_delay_ms(2);
	temp += ADC;
	_delay_ms(2);
	temp+=ADC;
	temp = temp/3;
	
	adc_v = (unsigned long)temp*5000/1024;	//数据处理得到被测电压值
	if ( adc_v <= 3000 )
	{	
		if (adc_v <= 300)
		{
			OCR0A = 0x19;		//10% 0x19
		}
		if ((300< adc_v)  && (adc_v <= 600))
		{
			OCR0A = 0x33;		//20%
		}
		if ((600< adc_v)  && (adc_v  <= 900))
		{
			OCR0A = 0x4C;		//30%
		}
		if ((900 < adc_v)  && (adc_v  <= 1200))
		{
			OCR0A = 0x66;		//40%
		}
		if ((1200< adc_v) && (adc_v <= 1500))
		{
			OCR0A = 0x7F;		//50%
		}
		if ((1500< adc_v) && (adc_v <= 1800))
		{
			OCR0A = 0x99;		//60%
		}
		if ((1800< adc_v) && (adc_v <= 2100))
		{
			OCR0A = 0xB2;		//70%
		}
		if ((2100< adc_v) && (adc_v <= 2400))
		{
			OCR0A = 0xCC;		//80%
		}
		if ((2400< adc_v)  && (adc_v <= 2700))
		{
			OCR0A = 0xE5;		//90%
		}
		if ((2700< adc_v) && (adc_v  <= 3000))
		{
			OCR0A = 0xFF;		//100%
		}
		
	}
	else
	{
		OCR0A =0xFF;// 0xFF;
	}
	
}

/*******  主函数  ********/

int main(void)
{
	init();		//初始化	
	while (1)
	{		
		ADC_Convert();
		if ( !((PINB & 0x10)== 0x10))
		{
			_delay_ms(200);		//排除干扰
			if ( !((PINB & 0x10)== 0x10))
			{
				PORTB |= (1 << PORTB1);	//控制继电器吸合,启动保护
				OCR0A =0xFF;		//风扇全速
				LED1;		//测试指示灯
				_delay_ms(8000);	//吸何8sec
				PORTB &= ~(1 << PORTB1);	//继电器断开
				LED0;
				_delay_ms(1000);
			}
			
		}
	}
	return 0;
}

附:熔丝位配置图

 网上资料比较少,研究调试半天,小冷门,需要的朋友直接用。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值