关闭

mega328p-ADC,PWM,UART驱动

标签: AVRADCPWMUARTIAR
36人阅读 评论(0) 收藏 举报
分类:

ADC驱动:

//****************************************************************/
//函 数 名: Ai_Init
//函数功能: Ai端口初始化
//输入参数: void
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
void Ai_Init(void)
{
    // 外部引脚
    DDRC = 0X00;
    PORTC = 0X00;
    
    //基准设置(外部AVCC)
    ADMUX &= ~(1 << REFS1);
    ADMUX |= 1 << REFS0;
    
    DIDR0 = 0X3F;
    
    //转换数据对齐(右对齐)
    ADMUX &= ~(1 << ADLAR);
    ADMUX |= 0X01;
    //转换设置
    ADCSRA |= 1 << ADEN;                //开启ADC功能
    ADCSRA |= (1 << ADSC);             //转换开始
    ADCSRA |= 1 << ADATE;               //自动触发使能
    ADCSRA |= 1 << ADIF;                //清零完成标记
    ADCSRA &= ~(1 << ADPS2);            //ADC时钟分频系数 2
    ADCSRA &= ~(1 << ADPS1);
    ADCSRA |= 1 << ADPS0;
    
    //连续触发模式
    ADCSRB &= ~(1 << ADTS2);
    ADCSRB &= ~(1 << ADTS1);
    ADCSRB &= ~(1 << ADTS0);
    
    ADCSRA |= 1 << ADSC;                  //转换开始
}

//****************************************************************/
//函 数 名: Read_Ad
//函数功能: 读AD转换值
//输入参数: ucEn (bit0-bit7:通道0-通道7)
//输出参数: void
//返 回 值: AD结果
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
UINT16 Read_Ad(UCHAR ucEn)
{
    UCHAR ucCh;
    
    ucCh = ucEn & 0x07;
  
    //转换通道
    ADMUX &= ~0x07;
    ADMUX |= ucCh;
  
    ADCSRA |= 1 << ADSC;                  //转换开始
    while (!(ADCSRA & (1 << ADIF)))
    {//等待转换完成
        vTaskDelay(1);
    }
    ADCSRA |= 1 << ADIF;                //清零完成标记
    
    return (ADC & 0x3ff);
}

//****************************************************************/
//函 数 名: Get_Vol
//函数功能: 取电压值
//输入参数: ucEn 
//输出参数: void
//返 回 值: AD结果
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
float Get_Vol(UCHAR ucEn)
{
    UCHAR ucCh;
    UINT16 ui16Val;
    float fVal;
    
    ucCh = ucEn & 0x07;
  
    ui16Val = Read_Ad(ucCh);
    
    fVal = ui16Val * AI_REF / AI_FULL;
    
    return (fVal);
}
/****************************************************************
*                       end of file
****************************************************************/

PWM驱动:

//****************************************************************/
//函 数 名: Pwm_Init
//函数功能: Pwm端口初始化
//输入参数: void
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
void Ao_Init()
{
    //OCB1
    DDRB |= 1 << 2;
    PORTB |= 1 << 2;
    
    //时钟选择 (64分频)
    TCCR1B &= ~(1 << CS12);
    TCCR1B |= 1 << CS11;
    TCCR1B |= 1 << CS10;
    
    //模式 (快速PWM 模式15)
    TCCR1A |= 1 << WGM11;
    TCCR1A |= 1 << WGM10;
    TCCR1B |= 1 << WGM13;
    TCCR1B |= 1 << WGM12;
    
    //比较匹配时清零
//    TCCR1A |= 1 << COM1A1;          //OC1A
//    TCCR1A |= 1 << COM1A0;  
    TCCR1A |= 1 << COM1B1;             //OC1B
    TCCR1A &= ~(1 << COM1B0);  
    
//    OCR1A = 0X3FF;                   //周期
//    OCR1B = 125;                    //占空比
    
    OCR1A = PWM_CLY;                  //周期
    OCR1B = 1;                       //占空比    
}

//****************************************************************/
//函 数 名: Set_Pwm
//函数功能: 设定PWM占空比
//输入参数: ui16Pwm
//输出参数: void
//返 回 值: 
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
void Set_Pwm(UINT16 ui16Pwm)
{
    UINT16 ui16Val;
    float t;
    
    if (ui16Pwm > PWM_FULL) ui16Pwm = PWM_FULL;
    
    ui16Val = (ui16Pwm * PWM_CLY) / PWM_FULL;
    
    OCR1B = ui16Val;
}

UART驱动:

#define UARTCNT           1
#define UARTBUF_SIZE     128
typedef struct
{
    UINT16  ui16Head;
    UINT16  ui16Tail;
    UCHAR   ucBuf[UARTBUF_SIZE];
}tagUARTBUF;
static tagUARTBUF tagUartTxBuf[UARTCNT];			//发送缓冲
static tagUARTBUF tagUartRxBuf[UARTCNT];			//接受缓冲
#define TX_LEN(x) ((unsigned short)(tagUartTxBuf[x].ui16Head - tagUartTxBuf[x].ui16Tail))
#define RX_LEN(x) ((unsigned short)(tagUartRxBuf[x].ui16Head - tagUartRxBuf[x].ui16Tail))

//****************************************************************/
//函 数 名: Uart_Init
//函数功能: Uart端口初始化
//输入参数: 
//ui32ClkFrg: 主时钟频率
//ui32Bps   : 波特率
//ui16DataBit:数据位
//ui16ParityBit:校验位
//ui16StpBit:   停止位
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/02/09
//修改历史: 
//****************************************************************/
void Uart_Init(const UINT32 ui32ClkFrg, \
               const UINT32 ui32Bps, const UINT16 ui16DataBit, \
               const UINT16 ui16ParityBit, const UINT16 ui16StpBit)
{
    UINT16 ui16Val = 0x00;
    
    portENTER_CRITICAL();                       //中断禁止
    
    UCSR0A |= 1 << U2X0;                        //异步倍数模式
    UCSR0A &= ~(1 << MPCM0);                    //禁用多机处理
    
    UCSR0C &= ~(1 << UMSEL01);                   //异步工作模式
    UCSR0C &= ~(1 << UMSEL00);
      
    //数据位
    switch (ui16DataBit)
    {
        default:
        case 8:
          UCSR0C |= 1 << UCSZ01;
          UCSR0C |= 1 << UCSZ00;
          UCSR0B &= ~(1 << UCSZ02);
          break;
        case 9:
          UCSR0C |= 1 << UCSZ01;
          UCSR0C |= 1 << UCSZ00;
          UCSR0B |= 1 << UCSZ02;          
          break;
    }
    
     //校验位
    switch (ui16ParityBit)
    {
        default:
        case 0:             //无校验
          UCSR0C &= ~(1 << UPM01);
          UCSR0C &= ~(1 << UPM00);           
          break;
        case 1:             //奇校验
          UCSR0C |= 1 << UPM01;
          UCSR0C |= 1 << UPM00;          
          break;
        case 2:             //偶校验
          UCSR0C |= 1 << UPM01;
          UCSR0C &= ~(1 << UPM00);           
          break;          
      
    }

    //停止位
    if (ui16StpBit > 1)
    {//2位
        UCSR0C |= 1 << USBS0;
    }
    else
    {//1位
        UCSR0C &= ~(1 << USBS0);      
    }

    //波特率
    if (UCSR0A & (1 << U2X0))
    {
        ui16Val = ui32ClkFrg / ui32Bps / 8 - 1;
    }
    else
    {
        ui16Val = ui32ClkFrg / ui32Bps / 16 - 1;
    }

    UBRR0 = ui16Val;
    
    //中断
    UCSR0B |=  1 << RXCIE0;                     //接收完成中断
    UCSR0B |=  1 << UDRIE0;                     //数据寄存器空中断
    
    UCSR0B |= 1 << RXEN0;                       //接收使能  
    UCSR0B |= 1 << TXEN0;                       //发送使能   
    
    
    //缓冲初始化
    tagUartTxBuf[0].ui16Head    =   0;
    tagUartTxBuf[0].ui16Tail    =   0;
    tagUartRxBuf[0].ui16Head    =   0;
    tagUartRxBuf[0].ui16Tail    =   0;    
    
    portEXIT_CRITICAL();                        //中断使能
}

////****************************************************************
////函 数 名: Send_Char
////函数功能: 发送一个字节
////输入参数: USART_TypeDef* USARTx //串口号
////          uChar                 //字节
////输出参数: void
////返 回 值: void
////参考文档: void
////创 件 人: 程强刚
////创建日期: 2015/10/06
////修改历史: 
////****************************************************************
//void Send_Char(UCHAR uChar)
//{
//    while (!(UCSR0A & (1 << UDRE0)))
//    {
//        vTaskDelay(1);
//    }
//    UDR0 = uChar;
//}

//****************************************************************
//函 数 名: Send_Char
//函数功能: 发送一个字节
//输入参数: USART_TypeDef* USARTx //串口号
//          uChar                 //字节
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2015/10/06
//修改历史: 
//****************************************************************
void Send_Char(UCHAR uChar)
{
    while (TX_LEN(0) >= UARTBUF_SIZE)
    {
        vTaskDelay(1);			//等待数据发送
    }
    /*写数据到缓冲*/
    if (TX_LEN(0) < UARTBUF_SIZE) 
    {
        tagUartTxBuf[0].ucBuf[tagUartTxBuf[0].ui16Head &
                             (UARTBUF_SIZE - 1)] = uChar;
        tagUartTxBuf[0].ui16Head++;
        
        //开发送中断
//        if ()
    }
}
//****************************************************************
//函 数 名: Uart_WriteDate
//函数功能: 串口发送数据
//输入参数: *ucpBuf ui16Len
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2015/10/07
//修改历史: 
//****************************************************************
void Uart_WriteDate(UCHAR *ucpBuf, UINT16 ui16Len)
{
    while (ui16Len--)
    {
        Send_Char(*ucpBuf++);
    } 
}

//****************************************************************
//函 数 名: Get_Char
//函数功能: 取一个字节
//输入参数: USART_TypeDef* USARTx //串口号
//输出参数: void
//返 回 值: ucCh
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2015/10/06
//修改历史: 
//****************************************************************
UCHAR Get_Char() 
{
	UCHAR ucCh;
    
	ucCh = tagUartRxBuf[0].ucBuf[tagUartRxBuf[0].ui16Tail &
								(UARTBUF_SIZE - 1)];
    tagUartRxBuf[0].ui16Tail++;
    
	return (ucCh);  
}
//****************************************************************
//函 数 名: Uart_ReadDate
//函数功能: 串口读数据
//输入参数: *ucpBuf ui16Len
//输出参数: void
//返 回 值: ui6Len
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2015/10/07
//修改历史: 
//****************************************************************
UINT16 Uart_ReadDate(UCHAR *ucpBuf, UINT16 ui16Len)
{
	UINT16  ui16ReadLen;
	
	ui16ReadLen = 0;
	
    while (RX_LEN(0) == 0)
    {
        vTaskDelay(1);			//等待接受数据
    }

    while (ui16Len > 0)
    {
        if (RX_LEN(0) > 0)
        {
            *ucpBuf++ = Get_Char();
            ui16ReadLen++;
            ui16Len--;
            if (RX_LEN(0) == 0) 
            {
                vTaskDelay(1);	//等待接受数据
            }
        }
        else break;
    }	
	
	return (ui16ReadLen);  
}
//****************************************************************
//函 数 名: USART_RX_Irq
//函数功能: UART1接收中断服务
//输入参数: void
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/03/04
//修改历史: 
//****************************************************************
#pragma vector = USART_RX_vect
__interrupt void USART_RX_Irq(void)
{
    UCHAR ucTmp;
    
    if (UCSR0A & (1 << FE0) ||          //帧错误
        UCSR0A & (1 << DOR0) ||         //数据溢出
        UCSR0A & (1 << UPE0))           //校验错误
    {
        ucTmp = UDR0;
    }
    
    if (((tagUartRxBuf[0].ui16Head - tagUartRxBuf[0].ui16Tail) & ~(UARTBUF_SIZE-1)) == 0)
    {
        tagUartRxBuf[0].ucBuf[tagUartRxBuf[0].ui16Head & (UARTBUF_SIZE-1)] = UDR0;
        tagUartRxBuf[0].ui16Head++;
    }    
}
//****************************************************************
//函 数 名: USART_TX_Irq
//函数功能: UART1发送中断服务(数据寄存器为空)
//输入参数: void
//输出参数: void
//返 回 值: void
//参考文档: void
//创 件 人: 程强刚
//创建日期: 2016/03/04
//修改历史: 
//****************************************************************
#pragma vector = USART_UDRE_vect
__interrupt void USART_TX_Irq(void)
{
    
    if (tagUartTxBuf[0].ui16Head != tagUartTxBuf[0].ui16Tail)
    {
        UDR0 = tagUartTxBuf[0].ucBuf[tagUartTxBuf[0].ui16Tail & (UARTBUF_SIZE-1)];
        tagUartTxBuf[0].ui16Tail++;
    }    
}
/****************************************************************
*                       end of file
****************************************************************/
     附件:完整实例代码(IAR)

     密码:oirq

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

STM32接收串口数据-输出PWM

#include #include "sys.h" #include "usart.h" #include "delay.h" #include "led.h" #include "key....
  • bolvtin
  • bolvtin
  • 2015-07-04 11:38
  • 1854

STM32 多通道ADC采样,采用Timer1进行采样率控制,利用DMA进行传输

STM32的里有利用Timer进行ADC采样频率控制例程,但是只有一个通道。下面是6个规则通道ADC采样,利用Timer1的第一通道进行控制,ADC采样完成后利用DMA将数据传输到SRAM里,传输完毕...
  • varding
  • varding
  • 2013-12-25 17:29
  • 6452

LINUX下ADC按键驱动程序

ADC按键驱动 Adc键盘原理图如下,将串联电阻之间分别用按键引出来与地相连,当按键按下时端电压会发生改变。基本思想是在ADC驱动基础上,对采样电压进行判断,检测是哪一个按键按下。 1.   ...
  • feng85016578
  • feng85016578
  • 2016-09-27 10:21
  • 1306

mega328p watchdog 无效解决方案

以前一直用mega2560,好不容易解决了watchdog的问题,看门狗正常工作。 新项目中boss要求mega328p也能够支持看门狗,想想应该是比较容易的,毕竟avr官方文档中有对watchdo...
  • tp1112
  • tp1112
  • 2015-01-15 22:22
  • 750

Arduino nano mega328P datasheet

  • 2017-07-14 21:36
  • 470KB
  • 下载

FreeRTOS在mega328p中的移植

  • 2018-01-10 17:30
  • 64.16MB
  • 下载

智能小车49:atmel328p的pwm调速试验

智能小车的变速怎么实现?arduino uno的芯片atmel328p的引脚可以配置pwm功能。简单来说,这个功能就能调整电流的大小,这样就能控制电机的变速,led不同频率的闪烁。 先看下ardui...
  • koolfret
  • koolfret
  • 2017-12-13 15:22
  • 46

msp430f5529 uart pwm adc

#include "msp430_UART.h"#if USCIA0_EN >0/**********************************************************名...
  • u012796139
  • u012796139
  • 2014-08-21 15:48
  • 2875

USB转I2C,SPI,CAN,GPIO,UART,ADC,PWM,GPIO上位机软件

  • 2017-07-22 11:47
  • 32.57MB
  • 下载

CC3200-UART-ADC-PWM

在CC3200SDK-1.2.0上测试可用,下面是main函数的代码:注意:需使用example adc project 进行代码融合//采集电压以PWM的方式输出,串口接收相关指令,执行相关操作,...
  • qq_28362827
  • qq_28362827
  • 2017-06-30 20:54
  • 464
    个人资料
    • 访问:241次
    • 积分:103
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档