mega328p-ADC,PWM,UART驱动

标签: AVR ADC PWM UART IAR
191人阅读 评论(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

查看评论

adc和pwm

at91_adc.c at91_adc_probe() {     申请iio_dev     从中提取 at91_adc_state     填充at91_adc_state  ...
  • jun7118
  • jun7118
  • 2016-06-30 19:49:51
  • 222

mega328p-ADC,PWM,UART驱动

ADC驱动: //****************************************************************/ //函 数 名: Ai_Init //函数功...
  • cqg_Blog
  • cqg_Blog
  • 2018-01-13 19:19:49
  • 191

nRF51822 ADC PWM

网上nRF51822的资料太少了,这么两天看了一点
  • zhaokanghui
  • zhaokanghui
  • 2014-11-21 13:19:42
  • 2589

高性能工业级16位高精度UART转PWM接口SOC芯片

ZW10U8系列 ● 接口标准 - 通用的UART异步通讯协议,固定波特率4800,1位开始,1位停止,无校验,TTL3.3-5V。 - 1个使能脚(ZW10U8xE后缀带E的),低功耗应用...
  • fgh00000
  • fgh00000
  • 2017-12-11 11:47:19
  • 179

通过串口来控制pwm的输出

  • 2012年01月09日 10:58
  • 1.92MB
  • 下载

stm32 ADC的规则通道和注入通道混合使用 双adc dma tim触发 pwm 电机

原文地址,后面有添加: http://www.cnblogs.com/nixianmin/p/3192634.html 之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候...
  • lanmanck
  • lanmanck
  • 2016-02-05 15:15:11
  • 3566

BeagleBone Black板第十课:测试PWM功能

BBB板第十课:测试PWM功能 上一节课我们初步学习了BBB板上ADC数据的读取方法,本节课将把学到的PWM的知识贡献给和我一样的初学者。以下这张彩图来自网上,详细标明了14个PWM和四个定时器的引...
  • luyejie8888
  • luyejie8888
  • 2014-09-10 09:43:39
  • 9698

pwm驱动原理和代码实现

第一个知识点:I/O映射和内存映射所牵扯到的知识点,包括统一编址和独立编址,以及linux下怎么对这两种方式编程,以及这两种方式下怎么访问外设。 第二个知识点:映射到内存哪里?怎么映射?所以就涉及到l...
  • YuZhiHui_No1
  • YuZhiHui_No1
  • 2015-07-22 23:43:22
  • 3515

通过uart选择开关(74hc4052)pwm的输出pwm

  • 2012年01月09日 11:02
  • 2.01MB
  • 下载

linux驱动开发之pwm蜂鸣器

http://blog.csdn.net/changliang7731/article/details/52297561 驱动开发,控制pwm蜂鸣器!  蜂鸣器有多种类型,...
  • sunjing_
  • sunjing_
  • 2016-11-23 15:01:34
  • 460
    个人资料
    持之以恒
    等级:
    访问量: 1333
    积分: 111
    排名: 123万+
    文章存档