为什么优快云写文这么难受QAQ写了好几遍了,每次一粘贴就要崩掉重写…太痛苦了orz)
一、ADC
TM4有两个ADC,分别为ADC0和ADC1。每个ADC位数为12位,下设12个通道,所以总共可以采24路数据。
还可以做差分,可以参考tivaware里外设examples
获取采样值,0-4095,对应0-3.3V
即adc_val =adc_get_value*3.3/4096
注意TM4的ADC有一个”序列“的概念。有4种序列分别是SS0,SS1,SS2,SS3。对应FIFO深度为8,4,2,1。
这个在下面函数有解释,简单来讲就是深度为8的话采8次才算结束。
//ADC编写通用过程
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
//外设时钟开启,这里开启了ADC0
DCSequenceConfigure(ADC0_BASE, 3,ADC_TRIGGER_PROCESSOR, 0);
//ADC基地址/序列3/触发器 /优先级最高(可选0~3)
//ADC有两个:ADC0和ADC1
//序列:0~3,对应FIFO深度不同,序列0对应深度8,序列3对应深度1
//触发源?这个有定时器触发或者比较器、PWM触发但是没看懂(我估计processor指自己控制触发中断?)
//优先级:0~3,0最高。
//优先级补充:当同时发生多个采样事件(触发条件)时,将按照 ADC 采样序列器优先级 (ADCSSPRI) 寄存器中
的值对它们进行排序和依次处理。优先级的有效值为0~3,其中0代表最高优先级、3代表最低优先
级。如果多个活动的采样序列具有相同的优先级,将导致转换结果数据不连续,因此软件必须确保
当前活动的所有采样序列各自具有唯一的优先级。
ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH0|ADC_CTL_IE |ADC_CTL_END);
//基地址/序列号/step(我猜是隔几个采一次?)/或选项(通道0、中断、ADC_CTL_END表示到此该次采样序列结束)
附一个TI论坛看到的例子解释序列的概念:
(地址:https://e2echina.ti.com/question_answer/microcontrollers/tiva_arm_cortex/f/96/t/24764#pi58417=1)
ADCSequenceStepConfigure(ADC0_BASE, 0, 0,ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC0_BASE, 0, 1,ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 0, 2,ADC_CTL_CH3);
ADCSequenceStepConfigure(ADC0_BASE, 0, 3,ADC_CTL_CH4 | ADC_CTL_IE);
ADCSequenceStepConfigure(ADC0_BASE, 0, 4,ADC_CTL_CH5);
ADCSequenceStepConfigure(ADC0_BASE, 0, 5,ADC_CTL_CH6);
ADCSequenceStepConfigure(ADC0_BASE, 0, 6,ADC_CTL_CH7);
ADCSequenceStepConfigure(ADC0_BASE, 0, 7,ADC_CTL_CH8 | ADC_CTL_IE | ADC_CTL_END);
ADC_CTL_CHx表示从哪个通道采样,ADC_CTL_IE表示该次采样后会产生中断;ADC_CTL_END表示到此该//次采样序列结束。所以上面的序列表示从通道1一直采样到通道8,并且在通道4和通道8采样的时候分别产生一次ADC中断,并且通道8采样完成后本次采样序列结束。因为序列0有8次采样,所以序列里面有8个语句,而楼主的程序里面选的是序列3,只有一个采样。所以这个采样从通道3采样,并且产生ADC中断,而且是这个序列的最后一个采样。
ADCSequenceEnable(ADC0_BASE, 3);
//序列使能
ADCIntClear(ADC0_BASE, 3);
//清除中断标志,这里是为了保证标志位已经被清除
while(1)
{
ADCProcessorTrigger(ADC0_BASE, 3);
//开启转换,第一个是哪个ADC,第二个是序列
while(!ADCIntStatus(ADC0_BASE, 3, false))
{ }
//等待转换结束,输入参数分别是:哪个ADC,序列,是否masked?(这个没懂,似乎和中断有关),一般false即可
ADCIntClear(ADC0_BASE,3);
//清除标志
ADCSequenceDataGet(ADC0_BASE, 3, ADC0Value);
//取ADC数据,最后那个是地址,指向缓存首地址(unsigned int型)
//其他逻辑
}
二、PWM
参考的https://www.cnblogs.com/pursuit1996/p/5070464.html
使用范例
// PWM 初始化,频率为1000,占空比为0
M1PWM7_init(1000, 0);//初始化
M1PWM7_set_duty(duty);//设置占空比
PWMOutputState(PWM1_BASE, PWM_OUT_7_BIT, false); // 灭灯
函数定义
//PWM初始化(包成了一个函数)
void M1PWM7_init(uint32_t freq, float duty)
{
//设置PWM时钟为系统时钟的1分频
SysCtlPWMClockSet(SYSCTL_PWMDIV_1);
SysCtlPeripheralEnable(SYSCTL_PERIPH_PWM1);
//配置引脚为PWM功能
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinConfigure(GPIO_PF3_M1PWM7);
GPIOPinTypePWM(GPIOF, Pin3);
//M1PWM7
//配置 PWM1 Generator3·发生器
PWMGenConfigure(PWM1_BASE, PWM_GEN_3,PWM_GEN_MODE_UP_DOWN|PWM_GEN_MODE_NO_SYNC);
//配置 PWM1 Generator3 周期
PWMGenPeriodSet(PWM1_BASE, PWM_GEN_3, SysCtlClockGet()/freq - 1);
//配置 PWM1 Generator3 占空比
*PWMPulseWidthSet(PWM1_BASE, PWM_OUT_7, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)duty-1);
//使能 PWM1 输出
PWMOutputState(PWM1_BASE, PWM_OUT_7_BIT, true);
//使能 PWM1 发生器模块
PWMGenEnable(PWM1_BASE, PWM_GEN_3);
}
// 设置占空比函数
void M1PWM7_set_duty(float duty)
{
//配置 PWM1 Generator3 占空比
PWMPulseWidthSet(PWM1_BASE,PWM_OUT_7, PWMGenPeriodGet(PWM1_BASE, PWM_GEN_3)*duty - 1);
PWMOutputState(PWM1_BASE, PWM_OUT_7_BIT, true);
//使能 PWM1 ·发生器模块
PWMGenEnable(PWM1_BASE, PWM_GEN_3);
}
三、I2C
(未完,待修改)
(对不起各位看的了orz等我把智能车和保研做完了就更新整理好点TUT…谢谢大家的关注!!orz